碎片的简单用法及碎片与Activity之间的通信

碎片的简单用法及碎片与Activity之间的通信

  我们都知道手机界面的展示都是由Activity来完成,Acitivity特别常用。但Activity也有局限性在手机界面上显示正常,到了平板上就比较难看了。所以碎片(Fragment)就诞生了。我们也可以把碎片叫做小Activity。在Activity中嵌入两个Fragment。如下:

1、布局
MainActivity
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <fragment
        android:id="@+id/frLeft"
        android:name="com.valiantman.fragmentfenlan.LeftFragment"
        android:layout_width="223dp"
        android:layout_height="match_parent"/>

    <FrameLayout
        android:id="@+id/flContainer"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="2">
    </FrameLayout>
</LinearLayout>

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

    <ListView
        android:id="@+id/list_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:entries="@array/titles"
        android:scrollbars="none" />

</LinearLayout>

RightFragment
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center">

    <TextView
        android:id="@+id/tvDetail"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="30sp"/>

</LinearLayout>

2、LeftFragment 
通过接口回调得到数据,定义一个内部接口。在需要回调的类实现该接口,实现接口回调
public class LeftFragment extends BaseFragment {

    @Override
    public int getLayoutId() {
        return R.layout.fragment_left;
    }

    @Override
    public void operation() {
        final String[] titles = getResources().getStringArray(R.array.titles);

        ListView listView = (ListView) view.findViewById(R.id.list_view);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                if (resolver != null) {
                    resolver.showTitleDetail(titles[position]);
                }
            }
        });
    }

    //用于与Activity之前通信,通过回调把被点击的item的数据传递给Activity
    TitleResolver resolver;
    public void setResolver(TitleResolver resolver) {
        this.resolver = resolver;
    }

    interface TitleResolver {
        void showTitleDetail(String title);
    }
}

3、RightFragment
public class RightFragment extends BaseFragment {

    @Override
    public int getLayoutId() {
        return R.layout.fragment_right;
    }

    @Override
    public void operation() {
        TextView detail = (TextView) view.findViewById(R.id.tvDetail);
        Bundle bundle = getArguments();
        String title = bundle.getSerializable(str).toString();
        detail.setText(title);
    }
}

4、MainActivity
public class MainActivity extends AppCompatActivity implements LeftFragment.TitleResolver {

    private FragmentManager fragmentManager;
    private FragmentTransaction fragmentTransaction;
    private LeftFragment leftFragment;
    private RightFragment fragment;
    private Bundle bundle;
    public static final String str = "title";

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

        initFragment();
    }

    private void initFragment() {
        fragmentManager = getSupportFragmentManager();  //获取FragmentManager
        leftFragment = ((LeftFragment) fragmentManager.findFragmentById(R.id.frLeft));
        leftFragment.setResolver(this);
        String[] array = leftFragment.getResources().getStringArray(R.array.titles);
        replaceFragment();
        bundle = new Bundle();
        bundle.putString(MainActivity.str,array[0]);
        fragment.setArguments(bundle);
    }

    private void replaceFragment() {
        fragment = new RightFragment();
        fragmentTransaction = fragmentManager.beginTransaction();   //开启事务
        fragmentTransaction.replace(R.id.flContainer, fragment);    //替换Fragment
        fragmentTransaction.commit();                               //提交事务
    }

    @Override
    public void showTitleDetail(String title) {
        replaceFragment();
        bundle.putString(MainActivity.str,title);
        fragment.setArguments(bundle);
    }
}
看完代码我们都知道Fragment之间没有直接通信,而是通过与Activity关联来通信。效果图如下








  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值