Android 抽屜菜單

版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。
微博:厲圣杰
源碼:AndroidDemo/DrawerLayout
文中如有紕漏,歡迎大家留言指出。

Android 抽屜菜單實(shí)現(xiàn)方式主要有兩種方式,一是使用 Google 官方推出的側(cè)滑菜單實(shí)現(xiàn):DrawerLayout ,這個(gè)類是在 android-support-v4 包里;二是使用開源庫,如: SlidingMenu ,不過此開源庫自 2014年5月10號(hào)起就沒有更新過,更是留有二百多沒關(guān)閉的 issue ,故直接放棄此庫。所以只考慮使用 DrawerLayout 實(shí)現(xiàn)抽屜式菜單。

DrawerLayout

DrawerLayout 是窗口的頂級(jí)容器,它允許從窗口的左邊緣或右邊緣拉出抽屜式菜單。下圖是網(wǎng)易新聞抽屜式菜單樣式:


網(wǎng)易新聞抽屜式菜單

抽屜式菜單的定位和布局通過 android:layout_gravity 屬性來控制,其可選值為 leftright 或者 startend 。但是,每一邊緣只能設(shè)置一個(gè)抽屜式視圖,否則會(huì)拋出運(yùn)行時(shí)異常。

DrawerLayout 的第一個(gè)子View 用于顯示主要內(nèi)容,即抽屜菜單沒有打開時(shí)顯示的布局,它可以是 LinearLayout 、 FrameLayout ...第一個(gè)元素寬高默認(rèn)都是 match_parent 的而且不用設(shè)置 layout_gravity 屬性。

接下來緊跟的子元素是抽屜菜單,如 ListView 、 LinearLayout 等。抽屜式菜單一般高度都設(shè)為 match_parent ,而寬度不應(yīng)該超過 320dp ,這樣用戶可以在打開抽屜菜單時(shí)看到部分內(nèi)容界面。

典型 DrawerLayout 布局如下:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- The main content view -->
    <!-- 一般寬高都是 match_parent 且不用設(shè)置 layout_gravity 屬性 -->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <!-- 用于替換 ActionBar,如果不需要可以直接刪除 -->
        <include
            android:id="@+id/tool_bar"
            layout="@layout/tool_bar" />

        <!-- 一般 DrawerLayout 是與 Fragment 結(jié)合使用的,當(dāng)點(diǎn)擊抽屜菜單中的 item 時(shí),使用 FragmentManager 來實(shí)現(xiàn)切換,實(shí)現(xiàn)內(nèi)容頁的改變 -->
        <FrameLayout
            android:id="@+id/content_frame"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

    </LinearLayout>

    <!-- The navigation drawer -->
    <!-- layout_width 一般小于 320dp -->
    <!-- 通過設(shè)置 layout_gravity 對(duì)抽屜菜單進(jìn)行定位 -->
    <LinearLayout
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="left"
        android:background="@color/white"
        android:orientation="vertical">

        <!-- 實(shí)現(xiàn)自定義布局,不一定要是 ListView -->
    </LinearLayout>
    
    <LinearLayout
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="right"
        android:background="@color/white"
        android:orientation="vertical">

        <!-- 實(shí)現(xiàn)自定義布局,不一定要是 ListView -->
    </LinearLayout>

</android.support.v4.widget.DrawerLayout>

DrawerLayout 初試身手

前面講了 DrawerLayout 的基本用途、注意事項(xiàng)及其典型的布局格式,下面我們就進(jìn)行實(shí)戰(zhàn),實(shí)現(xiàn)如下效果:
![屏幕快照 2016-11-20 下午1.00.06](http://odsdowehg.bkt.clouddn.com/屏幕快照 2016-11-20 下午1.00.06.png)

從效果圖中可以看出來,抽屜菜單分為 header 和 list 兩部分,那么我們就需要在抽屜菜單這部分布局中實(shí)現(xiàn)。

activity_drawer_layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- The main content view -->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <include
            android:id="@+id/tool_bar"
            layout="@layout/tool_bar" />

        <TextView
            android:id="@+id/tv_content"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center" />

    </LinearLayout>

    <!-- The navigation drawer -->
    <LinearLayout
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="left"
        android:background="@color/white"
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/skyblue"
            android:gravity="center"
            android:orientation="horizontal"
            android:paddingBottom="20dp"
            android:paddingLeft="20dp"
            android:paddingTop="20dp">

            <ImageView
                android:id="@+id/iv_header"
                android:layout_width="60dp"
                android:layout_height="60dp"
                android:layout_gravity="center"
                android:src="@mipmap/ic_launcher" />

            <TextView
                android:id="@+id/tv_name"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical"
                android:layout_marginLeft="40dp"
                android:text="厲圣杰"
                android:textColor="@color/black"
                android:textSize="25sp" />
        </LinearLayout>

        <ListView
            android:id="@+id/lv_item"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="start"
            android:divider="@android:color/transparent"
            android:dividerHeight="0dp"
            android:listSelector="@color/colorAccent" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="right"
        android:background="@color/colorAccent">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:text="Right Drawer" />
    </LinearLayout>

</android.support.v4.widget.DrawerLayout>

主要代碼:

public class DrawerLayoutActivity extends AppCompatActivity {

    private int[] mIcons = new int[]{R.mipmap.ic_contacts_black_24dp, R.mipmap.ic_message_black_24dp
            , R.mipmap.ic_wifi_black_24dp, R.mipmap.ic_settings_black_24dp};
    private String[] mContents = new String[]{"Contacts", "Message", "Wifi", "Settings"};

    private DrawerLayout mDrawerLayout;
    private Toolbar mToolbar;
    private TextView mTvContent;
    private ListView mLvItem;
    private DrawerItemAdapter mAdapter;

    private ActionBarDrawerToggle mDrawerToggle;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_drawer_layout);

        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mToolbar = (Toolbar) findViewById(R.id.tool_bar);
        mTvContent = (TextView) findViewById(R.id.tv_content);
        mLvItem = (ListView) findViewById(R.id.lv_item);
        mAdapter = new DrawerItemAdapter();
        mLvItem.setAdapter(mAdapter);

        mLvItem.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                mTvContent.setText("Current Selected Item : " + position);
            }
        });

        //設(shè)置 Logo
        //mToolbar.setLogo(R.mipmap.ic_launcher);
        //使用 Toolbar 取代 ActionBar
        setSupportActionBar(mToolbar);
        //注意,設(shè)置 Toolbar 及相關(guān)點(diǎn)擊事件最好放在 setSupportActionBar 后,否則很可能無效
        //設(shè)置 Navigation 圖標(biāo)和點(diǎn)擊事件必須放在 setSupportActionBar 后,否則無效
        mToolbar.setNavigationIcon(R.mipmap.ic_menu_black_24dp);
        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, mToolbar,
                R.string.open_drawer, R.string.close_drawer);
        mDrawerLayout.addDrawerListener(mDrawerToggle);
    }

    class DrawerItemAdapter extends BaseAdapter {

        @Override
        public int getCount() {
            return mIcons.length;
        }

        @Override
        public Object getItem(int position) {
            return null;
        }

        @Override
        public long getItemId(int position) {
            return 0;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder vh;
            if (convertView == null) {
                vh = new ViewHolder();
                convertView = LayoutInflater.from(DrawerLayoutActivity.this).inflate(R.layout.item_drawer, null);
                vh.ivIcon = (ImageView) convertView.findViewById(R.id.iv_icon);
                vh.tvContent = (TextView) convertView.findViewById(R.id.tv_content);
                convertView.setTag(vh);
            }
            vh = (ViewHolder) convertView.getTag();
            vh.ivIcon.setImageResource(mIcons[position]);
            vh.tvContent.setText(mContents[position]);
            return convertView;
        }

        class ViewHolder {
            ImageView ivIcon;
            TextView tvContent;
        }
    }
}

這里有一點(diǎn)要注意的是,設(shè)置 Toolbar 及相關(guān)點(diǎn)擊事件最好放在 setSupportActionBar 后,否則很可能無效,關(guān)于 Toolbar 可以參考這篇文章

如果想要實(shí)現(xiàn)以下這種效果,則只需要對(duì)布局文件稍作修改即可。
![屏幕快照 2016-11-20 下午5.06.07](http://odsdowehg.bkt.clouddn.com/屏幕快照 2016-11-20 下午5.06.07.png)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <include layout="@layout/tool_bar" />

    <android.support.v4.widget.DrawerLayout
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <!-- The main content view -->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

            <TextView
                android:id="@+id/tv_content"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:gravity="center" />

        </LinearLayout>

        <!-- The navigation drawer -->
        <LinearLayout
            android:layout_width="240dp"
            android:layout_height="match_parent"
            android:layout_gravity="left"
            android:background="@color/white"
            android:orientation="vertical">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@color/skyblue"
                android:gravity="center"
                android:orientation="horizontal"
                android:paddingBottom="20dp"
                android:paddingLeft="20dp"
                android:paddingTop="20dp">

                <ImageView
                    android:id="@+id/iv_header"
                    android:layout_width="60dp"
                    android:layout_height="60dp"
                    android:layout_gravity="center"
                    android:src="@mipmap/ic_launcher" />

                <TextView
                    android:id="@+id/tv_name"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_vertical"
                    android:layout_marginLeft="40dp"
                    android:text="厲圣杰"
                    android:textColor="@color/black"
                    android:textSize="25sp" />
            </LinearLayout>

            <ListView
                android:id="@+id/lv_item"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="start"
                android:divider="@android:color/transparent"
                android:dividerHeight="0dp"
                android:listSelector="@color/colorAccent" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="240dp"
            android:layout_height="match_parent"
            android:layout_gravity="right"
            android:background="@color/colorAccent">

            <TextView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:gravity="center"
                android:text="Right Drawer" />
        </LinearLayout>

    </android.support.v4.widget.DrawerLayout>

</LinearLayout>

另外說明一點(diǎn),關(guān)于如此抽屜菜單樣式實(shí)現(xiàn)還有以下幾種方式:

  1. 通過往 ListView 中添加 Header
  2. 使用 NavigationView 實(shí)現(xiàn)

踩過的坑

測試 DrawerLayout 中踩了幾個(gè)坑,其中一個(gè)就是在設(shè)置 Toolbar 的 Navigation 圖標(biāo)點(diǎn)擊事件無效,解決辦法就是將相關(guān)設(shè)置放在 setSupportActionBar() 方法后,另外幾個(gè)坑都是跟設(shè)置主題樣式有關(guān)。特此記錄 log 及相關(guān)的解決方法。

使用 DrawerLayout 碰到關(guān)于 style 的坑

FATAL EXCEPTION: main
Process: com.littlejie.drawerlayout, PID: 3964
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.littlejie.drawerlayout/com.littlejie.drawerlayout.DrawerLayoutActivity}: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2665)
   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
   at android.app.ActivityThread.-wrap12(ActivityThread.java)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)
   at android.os.Handler.dispatchMessage(Handler.java:102)
   at android.os.Looper.loop(Looper.java:154)
   at android.app.ActivityThread.main(ActivityThread.java:6119)
   at java.lang.reflect.Method.invoke(Native Method)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
   at android.support.v7.app.AppCompatDelegateImplV7.createSubDecor(AppCompatDelegateImplV7.java:343)
   at android.support.v7.app.AppCompatDelegateImplV7.ensureSubDecor(AppCompatDelegateImplV7.java:312)
   at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:277)
   at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:140)
   at com.littlejie.drawerlayout.DrawerLayoutActivity.onCreate(DrawerLayoutActivity.java:36)
   at android.app.Activity.performCreate(Activity.java:6679)
   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618)
   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726) 
   at android.app.ActivityThread.-wrap12(ActivityThread.java) 
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) 
   at android.os.Handler.dispatchMessage(Handler.java:102) 
   at android.os.Looper.loop(Looper.java:154) 
   at android.app.ActivityThread.main(ActivityThread.java:6119) 
   at java.lang.reflect.Method.invoke(Native Method) 
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 

碰到上述問題是,使用 AppCompatActivity 的主題設(shè)置不對(duì),將主題改為如下即可:

<style name="AppCompat" parent="Theme.AppCompat"></style>
FATAL EXCEPTION: main
Process: com.littlejie.drawerlayout, PID: 5397
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.littlejie.drawerlayout/com.littlejie.drawerlayout.DrawerLayoutActivity}: java.lang.IllegalStateException: This Activity already has an action bar supplied by the window decor. Do not request Window.FEATURE_SUPPORT_ACTION_BAR and set windowActionBar to false in your theme to use a Toolbar instead.
   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2665)
   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
   at android.app.ActivityThread.-wrap12(ActivityThread.java)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)
   at android.os.Handler.dispatchMessage(Handler.java:102)
   at android.os.Looper.loop(Looper.java:154)
   at android.app.ActivityThread.main(ActivityThread.java:6119)
   at java.lang.reflect.Method.invoke(Native Method)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
Caused by: java.lang.IllegalStateException: This Activity already has an action bar supplied by the window decor. Do not request Window.FEATURE_SUPPORT_ACTION_BAR and set windowActionBar to false in your theme to use a Toolbar instead.
   at android.support.v7.app.AppCompatDelegateImplV7.setSupportActionBar(AppCompatDelegateImplV7.java:198)
   at android.support.v7.app.AppCompatActivity.setSupportActionBar(AppCompatActivity.java:130)
   at com.littlejie.drawerlayout.DrawerLayoutActivity.onCreate(DrawerLayoutActivity.java:53)
   at android.app.Activity.performCreate(Activity.java:6679)
   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618)
   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726) 
   at android.app.ActivityThread.-wrap12(ActivityThread.java) 
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) 
   at android.os.Handler.dispatchMessage(Handler.java:102) 
   at android.os.Looper.loop(Looper.java:154) 
   at android.app.ActivityThread.main(ActivityThread.java:6119) 
   at java.lang.reflect.Method.invoke(Native Method) 
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 

發(fā)現(xiàn)上訴問題是因?yàn)?ActionBar 已經(jīng)存在引起,故將 style 改為:

<style name="AppCompat" parent="Theme.AppCompat.Light.NoActionBar"></style>

<!-- 若 windowNoTitle 為 false ,則會(huì)拋出下面的異常 -->
<style name="AppCompat1" parent="Theme.AppCompat.Light.DarkActionBar">
   <item name="windowActionBar">false</item>
   <item name="windowNoTitle">true</item>
</style>
Process: com.littlejie.drawerlayout, PID: 10761
 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.littlejie.drawerlayout/com.littlejie.drawerlayout.DrawerLayoutActivity}: java.lang.IllegalArgumentException: AppCompat does not support the current theme features: { windowActionBar: false, windowActionBarOverlay: false, android:windowIsFloating: false, windowActionModeOverlay: false, windowNoTitle: false }
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2665)
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
     at android.app.ActivityThread.-wrap12(ActivityThread.java)
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)
     at android.os.Handler.dispatchMessage(Handler.java:102)
     at android.os.Looper.loop(Looper.java:154)
     at android.app.ActivityThread.main(ActivityThread.java:6119)
     at java.lang.reflect.Method.invoke(Native Method)
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
  Caused by: java.lang.IllegalArgumentException: AppCompat does not support the current theme features: { windowActionBar: false, windowActionBarOverlay: false, android:windowIsFloating: false, windowActionModeOverlay: false, windowNoTitle: false }
     at android.support.v7.app.AppCompatDelegateImplV7.createSubDecor(AppCompatDelegateImplV7.java:458)
     at android.support.v7.app.AppCompatDelegateImplV7.ensureSubDecor(AppCompatDelegateImplV7.java:312)
     at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:277)
     at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:140)
     at com.littlejie.drawerlayout.DrawerLayoutActivity.onCreate(DrawerLayoutActivity.java:34)
     at android.app.Activity.performCreate(Activity.java:6679)
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618)
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726) 
     at android.app.ActivityThread.-wrap12(ActivityThread.java) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:154) 
     at android.app.ActivityThread.main(ActivityThread.java:6119) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 

參考

  1. Implementing Effective Navigation
  2. Android開發(fā)之DrawerLayout實(shí)現(xiàn)抽屜效果
  3. Toolbar 詳解
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,247評(píng)論 6 543
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,520評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,362評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,805評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,541評(píng)論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,896評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,887評(píng)論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,062評(píng)論 0 290
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,608評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,356評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,555評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,077評(píng)論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,769評(píng)論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,175評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,489評(píng)論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,289評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,516評(píng)論 2 379

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,734評(píng)論 25 708
  • 內(nèi)容抽屜菜單ListViewWebViewSwitchButton按鈕點(diǎn)贊按鈕進(jìn)度條TabLayout圖標(biāo)下拉刷新...
    皇小弟閱讀 46,865評(píng)論 22 665
  • 側(cè)滑菜單這種設(shè)計(jì),在很多 APP 上面都有看到,例如大版本3.0之前的知乎、網(wǎng)易新聞、滴滴打車等。有些熱衷于 An...
    GinkWang閱讀 25,520評(píng)論 2 35
  • 文/韓乾昌 小時(shí)候,沒錢買書。有一次,偷了我爸的幾塊錢,去附近最大的鎮(zhèn)子上,沒舍得吃那些老遠(yuǎn)就冒香氣的炒面和涼粉,...
    溫柔劍客路人甲閱讀 512評(píng)論 6 8
  • 如果,你晚上十點(diǎn)鐘下班,九點(diǎn)半時(shí)家里人說帶點(diǎn)吃的回來,只要是吃的就行,你會(huì)帶什么? 炸雞啤酒?燒烤?小蛋糕?一點(diǎn)點(diǎn)...
    周某某2019閱讀 367評(píng)論 4 1