自从Android推出Fragment之后,这个组件迅速被Android应用程序广泛使用。本篇继续探索Fragment的使用。
案例介绍:
功能:用一个Activity来管理两个Fragment,并且在其中一个Fragment中,点击按钮,影响到第二个Fragment。
截图:
运行结果:
说明:
1. 布局为列模式排列,最上面是一个Fragmet,中间是一个LinearLayout,最下面也是一个Fragmet;
2. 点击Fragment1的Button1, 会更新Fragment2中的textview;
点击Fragment2的Button2, 会更新Fragment1中的textview;
核心代码:
(1)MainActivity:
public class MainActivity extends Activity {
private static final String TAG = "MainActivity";
private List<Fragment> mFragmentList = new ArrayList<Fragment>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void putFragment(Fragment fragment) {
mFragmentList.add(fragment);
}
public Fragment getFragment(int index) {
return mFragmentList.get(index);
}
}
说明:
mFragmentList用于保存Fragment实例,并且提供putFragment和getFragment的方法。
(2)TopFragment: (BottomFragment的实现也是如此逻辑)
public class TopFragment extends Fragment {
private static final String TAG = "TopFragment";
private View convertView;
private TextView mTextview;
private Button mButton;
@Override
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
if (convertView == null) {
convertView = inflater.inflate(R.layout.fragment_top, container, false);
initView();
initClient();
}
return convertView;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
MainActivity activity = (MainActivity) getActivity();
activity.putFragment(this);
}
private void initView() {
mTextview = convertView.findViewById(R.id.text_top);
mButton = convertView.findViewById(R.id.button_top);
Log.i(TAG, "[initView]===" + mTextview.getText());
}
public void updateView(String data) {
mTextview.setText(data);
}
private void initClient() {
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MainActivity activity = (MainActivity) getActivity();
BottomFragment bottomFragment =(BottomFragment) activity.getFragment(1);
bottomFragment.updateView("被topFragment更新");
}
});
}
}
说明:
1. 在onActivityCreated中,获取fragment所在的activity,并且将fragment添加到list中;
2. 在点击事件中:
通过activity获取到要操作的目标Fragment(BottomFragment),并且调用BottomFragment的方法updateView,来达到修改BottomFragment的界面的目的。
MainActivity activity = (MainActivity) getActivity(); BottomFragment bottomFragment =(BottomFragment) activity.getFragment(1); bottomFragment.updateView("被topFragment更新");
(3)Activity的布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical"
>
<fragment
android:id="@+id/top_fragment"
android:name="com.test.mydemofrag2.ui.TopFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
>
</fragment>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_weight="1"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="mid text"
>
</TextView>
</LinearLayout>
<fragment
android:id="@+id/bottom_fragment"
android:name="com.test.mydemofrag2.ui.BottomFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
>
</fragment>
</LinearLayout>
说明:
布局为列模式排列,最上面是一个Fragmet,中间是一个LinearLayout,最下面也是一个Fragmet;