关于Fragment的一些知识点

一、固定布局

如果布局是固定的,不用动态添加fragment的,可以将业务逻辑写在fragment里,然后将fragment作为控件写在xml布局中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:weightSum="2"
tools:context="com.zhangym.study.fragmentstudydem.MainActivity">
<fragment
android:name="com.zhangym.study.fragmentstudydem.FragmentA"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
tools:layout="@layout/fragment_a" />
<fragment
android:name="com.zhangym.study.fragmentstudydem.FragmentB"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
tools:layout="@layout/fragment_b" />
</LinearLayout>

运行效果:

006y8lValy1fciwkdezjmj30iw0z0760

二、其他知识点

  • 一般的类似京东淘宝的那种主流布局可以使用RadioGroup + FrameLayout + Fragment实现,或者RadioGroup + ViewPager + Fragment然后禁用ViewPager的滑动即可;类似可以滑动的则使用RadioGroup + ViewPager + Fragment实现。

  • FragmentTransaction的常用方法:

    • transaction.add():添加一个fragment;
    • transaction.remove():移除一个fragment,若被移除的fragment未添加入回退栈,则会被直接销毁。
    • transaction.replace(): 替换当前的fragment,相当于先remove()再add()。
    • transaction.hide():隐藏当前fragment,该fragment依旧存在,并未被销毁。
    • transaction.show():显示被隐藏的fragment。fragment的onHiddenChanged(boolean hidden)方法可以检测fragment的状态。
  • FragmentTransaction.addToBackStack(String):将fragment添加入回退栈,这样点击返回键就不会退出当前的Activity,而是退出fragment了。

    1
    2
    3
    4
    5
    FragmentManager manager = getFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.add(R.id.frameLayout,new FragmentB(),"FragmentB");
    transaction.addToBackStack(null);
    transaction.commit();
  • Fragment与Activity的通信:

    • 如果你Activity中包含自己管理的Fragment的引用,可以通过引用直接访问所有的Fragment的public方法
    • 如果Activity中未保存任何Fragment的引用,但为每个fragment在添加时设置了一个TAG,或者在布局中为Fragment设置了id,可以通过getFragmentManager.findFragmentByTag()或者findFragmentById()获得任何Fragment实例,然后进行操作。
    • 在Fragment中可以通过onAttach(Activity)或者getActivity()取得activity。
  • 因为要考虑Fragment的重复使用,所以必须降低Fragment与Activity的耦合,而且Fragment更不应该直接操作别的Fragment,毕竟Fragment操作应该由它的管理者Activity来决定。所以通过回调的方式,由宿主Activity或者其他Fragment决定是否处理按钮的监听事件。

    Fragment的实现如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    public class FragmentA extends Fragment implements View.OnClickListener {
    private Context mContext;
    private FragmentAClickListener mListener;
    @Override
    public void onAttach(Context context) {
    super.onAttach(context);
    mContext = context;
    }
    public void setFragmentAClickLister(FragmentAClickListener lister){
    mListener = lister;
    }
    /**
    * 设置按钮点击的回调
    */
    public interface FragmentAClickListener {
    void onFragmentAClick();
    }
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_a, container, false);
    // view.findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
    // @Override
    // public void onClick(View view) {
    // FragmentManager manager = getFragmentManager();
    // FragmentTransaction transaction = manager.beginTransaction();
    // transaction.add(R.id.frameLayout,new FragmentB(),"FragmentB");
    // transaction.addToBackStack(null);
    // transaction.commit();
    // }
    // });
    view.findViewById(R.id.button).setOnClickListener(this);
    return view;
    }
    @Override
    public void onClick(View view) {
    mListener.onFragmentAClick();
    }
    }

    Activity的实现如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    public class MainActivity extends AppCompatActivity implements FragmentA.FragmentAClickListener {
    private FragmentA mFragmentA;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    if (savedInstanceState == null){
    mFragmentA = new FragmentA();
    }
    FragmentManager manager = getFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.add(R.id.frameLayout, mFragmentA, "FragmentA");
    transaction.commit();
    mFragmentA.setFragmentAClickLister(this);
    }
    @Override
    public void onFragmentAClick() {
    FragmentManager manager = getFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.add(R.id.frameLayout, new FragmentB(), "FragmentB");
    transaction.addToBackStack(null);
    transaction.commit();
    Logger.d("FragmentA按钮被点击!");
    }
    }
  • 为了防止在activity的状态发生变化创建重复的fragment,故可以在activity的onCreate()方法里判断saveInstanceState是否为null,为null时才新建fragment。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    public class MainActivity extends AppCompatActivity implements FragmentA.FragmentAClickListener {
    private FragmentA mFragmentA;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    if (savedInstanceState == null){
    mFragmentA = new FragmentA();
    }
    FragmentManager manager = getFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.add(R.id.frameLayout, mFragmentA, "FragmentA");
    transaction.commit();
    mFragmentA.setFragmentAClickLister(this);
    }
    @Override
    public void onFragmentAClick() {
    Toast.makeText(this, "test", Toast.LENGTH_SHORT).show();
    }
    }

    效果图如下:

如果觉得本文对你有帮助,请支持我!