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

xiaoxiao2021-02-28  132

碎片的简单用法及碎片与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关联来通信。效果图如下
转载请注明原文地址: https://www.6miu.com/read-79848.html

最新回复(0)