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

来源:互联网 发布:淘宝网是阿里巴巴的吗 编辑:程序博客网 时间:2024/06/05 20:59

碎片的简单用法及碎片与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关联来通信。效果图如下








原创粉丝点击