提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
最近开发中使用到Fragment,看了一下网上的资料都比较散,杂七杂八看了不少资料才搞定,所以记录一下自己从0开始怎么使用Fragment的.
一、添加并显示Fragment
1.首先需要新建一个类继承Fragment类,然后重写Fragment类中的onCreateView方法,返回一个rootview.
R.layout.fragment_first是自己写的一个xml布局,把需要的控件写进去后续会显示到activity的界面上
public class MyFragment extends Fragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_first, container, false);
return rootView;
}
}
2.要使用Fragment需要Activity继承FragmentActivity,AppCompatActivity也是从FragmentActivity继承来的,一般可以直接继承AppCompatActivity.
public class MyActivity extends AppCompatActivity {}
3.Fragment需要放在容器中,一般可以使用FragmentContainerView,在activity的xml文件中添加
<androidx.fragment.app.FragmentContainerView
android:id="@+id/FragmentContainerView"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
在activity中添加Fragment到容器中显示,第一次加载可以在oncreat中,后续可以在点击事件监听中调用show方法显示其他Fragment.
注意getSupportFragmentManager需要在FragmentActivity的子类中使用
FragmentContainerView fragmentContainerView;
FragmentTransaction fragmentTransaction;
MyFragment mFragment;
MyOtherFragment mFragment2;
Fragment mCurrentFragment;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
fragmentContainerView = findViewById(R.id.FragmentContainerView);
mFragment = new MYFragment();
show(mFragment);
}
@Override
public void onClick(View v) {
if (null == mFragment2) {
mFragment2 = new MyOtherFragment;
}
show(mFragment2);
}
private void show (Fragment fragment){
if (mCurrentFragment == fragment) {
return;
}
fragmentTransaction = getSupportFragmentManager().beginTransaction();
if (null == mCurrentFragment) {
fragmentTransaction
.add(R.id.FragmentContainerView,fragment)
.show(fragment)
.commit();
mCurrentFragment = fragment;
return;
}
if (!fragment.isAdded()) {
fragmentTransaction
.add(R.id.FragmentContainerView,fragment)
.hide(mCurrentFragment)
.show(fragment)
.commit();
} else {
fragmentTransaction
.hide(mCurrentFragment)
.show(fragment)
.commit();
}
mCurrentFragment = fragment;
}
二、给Fragment的view中添加点击事件,这里演示需要适配器的GridView,不需要适配器的话直接拿到对象添加事件监听即可
代码如下(示例):
通过onCreateView中返回的rootView来拿到对应ui的对象,可以保证操作的ui对象和activity中显示的对象是同一个
GridView mGv;
List<Data> mData;
MyAdapter mAdapter;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_first, container, false);
initView(rootView);
return rootView;
}
private void initView(View rootView) {
if (null == mData) {
mData = new ArrayList<Data>();
mData.add(new Data("0",R.drawable.0));
mData.add(new Data("1",R.drawable.1));
}
mAdapter = new MyAdapter(getActivity(),mData);
mGv = rootView.findViewById(R.id.gridview);
mGv.setAdapter(mAdapter);
mGv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//you can do anything
}
}
});
}
需要注意的是如果GridView的子view中有button之类的高优先级的view会导致onItemClick不触发,解决方案是给item中对应的view添加
android:focusable=“false”
android:clickable=“false”
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="false"
android:clickable="false" />