fragment+viewPager实现底部导航栏(一)

底部导航栏的实现有很多种方法,我这里采用的是最简单的LinearLayout+TextView布局,没有使用RadioGroup做布局,主要是为了兼容底部出现新消息小圆点的这种情况,本篇文章参考以下链接:
Fragment实例精讲——底部导航栏的实现

提前声明,本篇文章的讲解可能有些长,大家不妨先泡杯维维豆奶再来看戏。

先上一张效果图吧:

3.gif
提前准备

由于我项目中用到ButterKnife初始化控件,所以app gradle中需要引入ButterKnife的依赖:

    //butterKnife
    compile 'com.jakewharton:butterknife:8.5.1'
    //这条千万不能忘记!!
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'

ButterKnife的使用大家可以参考我的另一篇文章
butterknife的使用

首先说是设置底部导航栏中一个上面加有图片的textView和每个小方格中右上角显示小圆点的textView

1.先给出底部显示图片的TextView和显示小圆点的TextView的样式xml

在value文件夹下的stytel.xml中添加两个stytel

    <style name="tab_menu_text">
        <item name="android:layout_marginTop">5dp</item>
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:layout_centerInParent">true</item>
        <item name="android:gravity">center</item>
        <item name="android:textColor">@drawable/tab_menu_text</item>
    </style>

    <style name="tab_menu_bgnum">
        <item name="android:layout_width">30dp</item>
        <item name="android:layout_height">20dp</item>
        <item name="android:background">@drawable/shape_round_textview</item>
        <item name="android:layout_marginLeft">-10dp</item>
        <item name="android:textSize">12sp</item>
        <item name="android:gravity">center</item>
        <item name="android:textColor">@color/white</item>
    </style>
2.在drawable下写一个shape_round_textview.xml文件,用于实现小圆点TextView的圆形背景
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval"
    android:useLevel="false">
    <solid android:color="@color/color_f5cc1d" />
    <size android:width="15dp" android:height="15dp" />
</shape>

在drawable下写上点击底部文字颜色切换的tab_menu_text.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/red" android:state_selected="true" />
    <item android:color="@color/blue" />
</selector>

在drawable下写上点击底部图片切换的tab_menu_chat.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@mipmap/ic_launcher" android:state_selected="true" />
    <item android:drawable="@mipmap/ic_chat" />
</selector>

其它三个tab_menu_find.xml,tab_menu_user.xml,tab_menu_me.xml图片的切换与此类似,copy一下改改就行

3.写一个BaseFragment用于所有Fragment去继承它,记住,此处用的所有与fragment相关的都是用的v4包下的,别导错包了
package com.test.ui.fragment;

import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;

import com.test.util.StringUtil;
import com.test.util.ToastUtil;

import butterknife.ButterKnife;
import butterknife.Unbinder;

/**
 * Created by Admin on 2017/6/7.
 */

public abstract class BaseFragment extends Fragment {

    protected View mLayoutView;
    protected Context mContext;
    private Unbinder mUnbinder;

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        mContext = context;
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        mLayoutView = inflater.inflate(getLayoutId(), container, false);
        mUnbinder=ButterKnife.bind(this,mLayoutView);//绑定framgent
        onCreateFragmentView(inflater, container, savedInstanceState);


        return mLayoutView;
    }

    protected void onCreateFragmentView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        initData();
        setListener();
    }

    @Override
    public void onDestroy() {
        if(mUnbinder!=null){
            mUnbinder.unbind();
        }
        super.onDestroy();
    }

    protected abstract int getLayoutId();
    protected abstract void initData();
    protected abstract void setListener();

    /**
     * 获取editText的值
     *
     * @param et
     * @return
     */
    protected String getTextOfEditText(EditText et){
        if (et == null) {
            return null;
        }
        if (et.getText() == null) {
            return null;
        }
        if (StringUtil.isEmpty(et.getText().toString())) {
            return "";
        }
        return et.getText().toString().trim();
    }

    protected void showToast(String msg) {
        if (StringUtil.isNotEmpty(msg)) {
            ToastUtil.show(msg);
        }
    }

    protected void showShortToast(String msg){
        if (StringUtil.isNotEmpty(msg)) {
            ToastUtil.shortShow(msg);
        }
    }
}
4.给出第一个fragment的代码:
package com.test.ui.fragment;

import android.view.View;
import android.widget.TextView;

import com.test.R;

import butterknife.BindView;

/**
 * Created by Admin on 2017/6/7.
 */

public class Fragment1 extends BaseFragment implements View.OnClickListener{


    @BindView(R.id.txt_content)
    TextView mTvContext;

    @Override
    protected int getLayoutId() {
        return R.layout.one_fragment;
    }

    @Override
    protected void initData() {

    }

    @Override
    protected void setListener() {
        mTvContext.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.txt_content:
                TextView tab_menu_channel_num = (TextView)((MenuActivity)mContext).findViewById(R.id.tab_menu_channel_num);
                tab_menu_channel_num.setText("11");
                tab_menu_channel_num.setVisibility(View.VISIBLE);
                break;
        }
    }
}

下面是Fragment1的layout文件one_fragment.xml

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

    <TextView
        android:id="@+id/txt_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text="one"
        android:textColor="@color/black"
        android:textSize="20sp"/>

</LinearLayout>

Fragment2,Fragment3,Fragment4的代码和Fragment1类似,copy一下改改即可

5.然后是给出activity代码
package com.test.ui.fragment;

import android.content.Context;
import android.content.Intent;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.test.R;
import com.test.app.AppActivity;

import java.util.ArrayList;
import java.util.List;

import butterknife.BindView;

/**
 * Created by Admin on 2017/6/7.
 */

public class MenuActivity extends AppActivity implements View.OnClickListener,TabOnPageChangeListener.OnSelectedFragmentListener {

    public static Intent newIndexIntent(Context context) {
        Intent newIntent = new Intent(context, MenuActivity.class);
        return newIntent;
    }

    @BindView(R.id.ly_tab_menu_channel)
    LinearLayout ly_tab_menu_channel;
    @BindView(R.id.tab_menu_channel)
    TextView tab_menu_channel;
    @BindView(R.id.tab_menu_channel_num)
    TextView tab_menu_channel_num;

    @BindView(R.id.ly_tab_menu_message)
    LinearLayout ly_tab_menu_message;
    @BindView(R.id.tab_menu_message)
    TextView tab_menu_message;
    @BindView(R.id.tab_menu_message_num)
    TextView tab_menu_message_num;

    @BindView(R.id.ly_tab_menu_better)
    LinearLayout ly_tab_menu_better;
    @BindView(R.id.tab_menu_better)
    TextView tab_menu_better;
    @BindView(R.id.tab_menu_better_num)
    TextView tab_menu_better_num;

    @BindView(R.id.ly_tab_menu_setting)
    LinearLayout ly_tab_menu_setting;
    @BindView(R.id.tab_menu_setting)
    TextView tab_menu_setting;
    @BindView(R.id.tab_menu_setting_partner)
    ImageView tab_menu_setting_partner;

    @BindView(R.id.vpager)
    ViewPager mViewPager;

    private List<Fragment>mFragmentList;
    private MainPagerAdapter mainPagerAdapter;
    private TabOnPageChangeListener mTabOnPageChangeListener;


    @Override
    protected int getContentViewId() {
        return R.layout.activity_menu;
    }

    @Override
    protected void initData() {
        mFragmentList=new ArrayList<>();
        mFragmentList.add(0, new Fragment1());
        mFragmentList.add(1, new Fragment2());
        mFragmentList.add(2, new Fragment3());
        mFragmentList.add(3, new Fragment4());

        mTabOnPageChangeListener=new TabOnPageChangeListener(mViewPager);
        mainPagerAdapter = new MainPagerAdapter(getSupportFragmentManager(), mFragmentList);
        mViewPager.setOffscreenPageLimit(4);// 设置预加载Fragment个数
        mViewPager.setAdapter(mainPagerAdapter);
        mViewPager.setCurrentItem(0);// 设置当前显示标签页为第一页
    }

    @Override
    protected void setListener() {
        ly_tab_menu_channel.setOnClickListener(this);
        ly_tab_menu_message.setOnClickListener(this);
        ly_tab_menu_better.setOnClickListener(this);
        ly_tab_menu_setting.setOnClickListener(this);
        mViewPager.addOnPageChangeListener(mTabOnPageChangeListener);
        mTabOnPageChangeListener.setOnSelectedFragmentListener(this);
        //默认显示第一个fragment, 必须在ly_tab_menu_channel.setOnClickListener(this);之后执行
        ly_tab_menu_channel.performClick();
    }

    @Override
    public void onClick(View v){
        switch (v.getId()) {
            case R.id.ly_tab_menu_channel:
                clickFragment1();
                break;
            case R.id.ly_tab_menu_message:
                clickFragment2();
                break;
            case R.id.ly_tab_menu_better:
                clickFragment3();
                break;
            case R.id.ly_tab_menu_setting:
                clickFragment4();
                break;
        }
    }

    //重置所有文本的选中状态
    private void setSelected() {
        tab_menu_channel.setSelected(false);
        tab_menu_message.setSelected(false);
        tab_menu_better.setSelected(false);
        tab_menu_setting.setSelected(false);
    }

    private void clickFragment1(){
        setSelected();
        tab_menu_channel.setSelected(true);
        tab_menu_channel_num.setVisibility(View.INVISIBLE);
        mViewPager.setCurrentItem(0);
    }

    private void clickFragment2(){
        setSelected();
        tab_menu_message.setSelected(true);
        tab_menu_message_num.setVisibility(View.INVISIBLE);
        mViewPager.setCurrentItem(1);
    }

    private void clickFragment3(){
        setSelected();
        tab_menu_better.setSelected(true);
        tab_menu_better_num.setVisibility(View.INVISIBLE);
        mViewPager.setCurrentItem(2);
    }

    private void clickFragment4(){
        setSelected();
        tab_menu_setting.setSelected(true);
        tab_menu_setting_partner.setVisibility(View.INVISIBLE);
        mViewPager.setCurrentItem(3);
    }

    @Override
    public void selectedFragment(int index) {
        switch (index) {
            case 0:
                clickFragment1();
                break;
            case 1:
                clickFragment2();
                break;
            case 2:
                clickFragment3();
                break;
            case 3:
                clickFragment4();
                break;
        }
    }

    @Override
    protected void onDestroy(){
        super.onDestroy();
    }
}

需要注意的是:

  • 我的MenuActivity 继承的是AppActivity,而AppActivity 是我自己写的一个类似BaseActivity的类,大家也可直接 MenuActivity 继承 AppCompatActivity 即可。
  • setListener()方法中ly_tab_menu_channel.performClick();是为了默认显示第一个fragment,必须在ly_tab_menu_channel.setOnClickListener(this);之后执行

然后贴出 activity_menu.xml的代码

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RelativeLayout
        android:id="@+id/ly_top_bar"
        android:layout_width="match_parent"
        android:layout_height="48dp"
        android:background="@color/blue">

        <TextView
            android:id="@+id/txt_topbar"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_centerInParent="true"
            android:gravity="center"
            android:text="微信"
            android:textColor="@color/white"
            android:textSize="18sp" />
        <View
            android:layout_width="match_parent"
            android:layout_height="2px"
            android:layout_alignParentBottom="true"
            android:background="@color/white" />
    </RelativeLayout>





    <LinearLayout
        android:id="@+id/ly_tab_menu"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:background="@color/white"
        android:orientation="horizontal">

        <LinearLayout
            android:id="@+id/ly_tab_menu_channel"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center">

            <RelativeLayout
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:padding="5dp">

                <TextView
                    android:id="@+id/tab_menu_channel"
                    style="@style/tab_menu_text"
                    android:drawableTop="@drawable/tab_menu_chat"
                    android:text="weixin" />

                <TextView
                    android:id="@+id/tab_menu_channel_num"
                    style="@style/tab_menu_bgnum"
                    android:layout_toRightOf="@+id/tab_menu_channel"
                    android:text="99+"
                    android:visibility="gone" />
            </RelativeLayout>
        </LinearLayout>

        <LinearLayout
            android:id="@+id/ly_tab_menu_message"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="center">

            <RelativeLayout
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:padding="5dp">

                <TextView
                    android:id="@+id/tab_menu_message"
                    style="@style/tab_menu_text"
                    android:drawableTop="@drawable/tab_menu_user"
                    android:text="tongxun" />

                <TextView
                    android:id="@+id/tab_menu_message_num"
                    style="@style/tab_menu_bgnum"
                    android:layout_toRightOf="@+id/tab_menu_message"
                    android:text="99+"
                    android:visibility="gone" />
            </RelativeLayout>
        </LinearLayout>


        <LinearLayout
            android:id="@+id/ly_tab_menu_better"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="center">

            <RelativeLayout
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:padding="5dp">

                <TextView
                    android:id="@+id/tab_menu_better"
                    style="@style/tab_menu_text"
                    android:drawableTop="@drawable/tab_menu_find"
                    android:text="find" />

                <TextView
                    android:id="@+id/tab_menu_better_num"
                    style="@style/tab_menu_bgnum"
                    android:layout_toRightOf="@+id/tab_menu_better"
                    android:text="99+"
                    android:visibility="gone" />
            </RelativeLayout>
        </LinearLayout>


        <LinearLayout
            android:id="@+id/ly_tab_menu_setting"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="center">

            <RelativeLayout
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:padding="5dp">

                <TextView
                    android:id="@+id/tab_menu_setting"
                    style="@style/tab_menu_text"
                    android:drawableTop="@drawable/tab_menu_me"
                    android:text="me" />

                <ImageView
                    android:id="@+id/tab_menu_setting_partner"
                    android:layout_width="12dp"
                    android:layout_height="12dp"
                    android:layout_marginLeft="-5dp"
                    android:layout_toRightOf="@id/tab_menu_setting"
                    android:visibility="gone"
                    android:src="@mipmap/ic_launcher" />

            </RelativeLayout>
        </LinearLayout>
    </LinearLayout>



    <View
        android:id="@+id/div_tab_bar"
        android:layout_width="match_parent"
        android:layout_height="2px"
        android:layout_above="@id/ly_tab_menu"
        android:background="@color/white" />

    <android.support.v4.view.ViewPager
        android:id="@+id/vpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@id/div_tab_bar"
        android:layout_below="@id/ly_top_bar" />


</RelativeLayout>
6.MenuActivity中用到viewPager,肯定少不了适配器 MainPagerAdapter 了
package com.test.ui.fragment;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.view.View;

import java.util.List;

/***
 * 标签主页适配器
 *
 * @author pei
 * @version 1.0
 * @create 2016-6-21
 */
public class MainPagerAdapter extends FragmentPagerAdapter {

    private List<Fragment> mFragmentList;

    public MainPagerAdapter(FragmentManager fm, List<Fragment> mFragmentList) {
        super(fm);
        this.mFragmentList = mFragmentList;
    }

    @Override
    public Fragment getItem(int position) {
        // TODO Auto-generated method stub
        return mFragmentList == null ? null : mFragmentList.get(position);
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return mFragmentList == null ? 0 : mFragmentList.size();
    }

    @Override
    public void destroyItem(View container, int position, Object object) {
        //      super.destroyItem(container, position, object);
    }
}

7.MenuActivity中的viewPager本来是可以直接
    mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                
            }

            @Override
            public void onPageSelected(int position) {

            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

来监听滑动的,但是我为了去掉滑动到两端的时候出现阴影,所以用
TabOnPageChangeListener重新实现了下ViewPager.OnPageChangeListener()接口,下面贴出 TabOnPageChangeListener代码:

package com.test.ui.fragment;

import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.support.v4.widget.EdgeEffectCompat;

import java.lang.reflect.Field;

/***
 * TabMenuFragmentActivity  viewpager滑动监听(禁用滑到边界显示黑边)
 *
 * @author pei
 * @version 1.0
 * @create 2016-6-21
 */
public class TabOnPageChangeListener implements OnPageChangeListener {

    private ViewPager mViewPager;
    private OnSelectedFragmentListener mOnSelectedFragmentListener;

    private EdgeEffectCompat leftEdge;//去除viewpager滑到边界的黑边
    private EdgeEffectCompat rightEdge;//去除viewpager滑到边界的黑边

    public TabOnPageChangeListener(ViewPager viewPager) {
        this.mViewPager = viewPager;
        init();
    }

    public void setOnSelectedFragmentListener(OnSelectedFragmentListener onSelectedFragmentListener) {
        this.mOnSelectedFragmentListener = onSelectedFragmentListener;
    }

    private void init() {
        try {
            Field leftEdgeField = mViewPager.getClass().getDeclaredField("mLeftEdge");
            Field rightEdgeField = mViewPager.getClass().getDeclaredField("mRightEdge");
            if (leftEdgeField != null && rightEdgeField != null) {
                leftEdgeField.setAccessible(true);
                rightEdgeField.setAccessible(true);
                leftEdge = (EdgeEffectCompat) leftEdgeField.get(mViewPager);
                rightEdge = (EdgeEffectCompat) rightEdgeField.get(mViewPager);
            }
        } catch (NoSuchFieldException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        // 禁用滑到边界显示黑边
        if (leftEdge != null && rightEdge != null) {
            leftEdge.finish();
            rightEdge.finish();
            leftEdge.setSize(0, 0);
            rightEdge.setSize(0, 0);
        }
    }


    @Override
    public void onPageScrollStateChanged(int state) {
        //state的状态有三个,0表示什么都没做,1正在滑动,2滑动完毕
    }

    @Override
    public void onPageSelected(int position) {
        if (mOnSelectedFragmentListener != null) {
            mOnSelectedFragmentListener.selectedFragment(position);
        }
    }

    public interface OnSelectedFragmentListener {

        void selectedFragment(int index);
    }
}

8.可能有的同学对我MenuActivity所继承的AppActivity有疑问,那我就贴出来大家随便看看就好

package com.test.app;

import android.app.Activity;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;

import com.test.util.StringUtil;
import com.test.util.ToastUtil;

import butterknife.ButterKnife;
import butterknife.Unbinder;

/**

  • Created by Admin on 2017/5/16.
    */

public abstract class AppActivity extends AppCompatActivity{

protected View mLayoutView;//总布局
protected Activity mContext;
private Unbinder mUnbinder;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //赋值context
    mContext=this;
    //activity管理
    AppActivityManager.getInstance().addActivity(this);
    if (getContentViewId() != 0) {
        mLayoutView = LayoutInflater.from(mContext).inflate(getContentViewId(), null);
        setContentView(mLayoutView);
        //控件绑定
        mUnbinder= ButterKnife.bind(this);
    }
    initData();
    setListener();
}

/**设置布局**/
protected abstract int getContentViewId();

protected abstract void initData();

protected abstract void setListener();

@Override
protected void onDestroy() {
    if(mUnbinder!=null){
        mUnbinder.unbind();
    }
    super.onDestroy();
}

/**获取editText的值**/
protected String getTextOfEditText(EditText et) {
    if(et!=null&&et.getText()!=null){
        if(StringUtil.isEmpty(et.getText().toString())){
            return "";
        }else{
            return et.getText().toString().trim();
        }
    }
    return null;
}

protected void showShortToast(String msg) {
    if (StringUtil.isNotEmpty(msg)) {
        ToastUtil.shortShow(msg);
    }
}

protected void showLongToast(String msg) {
    if (StringUtil.isNotEmpty(msg)) {
        ToastUtil.show(msg);
    }
}

/** 用于初始化控件的 **/
protected <T> T getView(int rId) {
    View view = this.findViewById(rId);
    return (T) view;
}

}

9.我在Fragment1 中模拟了一个点击TextView显示消息小圆点,大家在用的时候,自己根据实际情况改改就成

ok,今天fragment+viewPager 实现底部导航栏的功能就基本实现了。谢谢诶。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,064评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,606评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,011评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,550评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,465评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,919评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,428评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,075评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,208评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,185评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,191评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,914评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,482评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,585评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,825评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,194评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,703评论 2 339

推荐阅读更多精彩内容