关于android:最新Androidx-Fragment的前世今生系列一之Fragment的简单使用

4次阅读

共计 4344 个字符,预计需要花费 11 分钟才能阅读完成。

背景

Fragment(碎片)是 Android3.0 提出来的概念,过后的次要目标是为了适配平板,筹备将 Activity 碎片化,每个局部独自解决。fragment 相较于 Activity 更加轻量,然而展现的成果与 Actvity 差不多,这给页面布局带来了更多的灵活性。因为 Androidx 的强制推广,以前的文章过于老旧,所以写下这一系列文章总结一下。

Fragment 的劣势

  • 模块化 能够不必将所有代码写在 Activity 中,而是写在 Fragment 中,升高耦合。
  • 可复用 fragment 能够被多个 Activity 重用。
  • 可适配 能够对不同大小的屏幕进行适配。

Fragment 的简略应用

办法一:动态增加

动态增加就是将 fragment 当作一个控件内嵌在 Activity 的布局文件之中,这种办法并不提倡,这就义了 Fragment 的灵活性,没有施展出 Fragment 应有的作用。应用如下
两个 Fragment FragmentOne 和 FragmentTwo 的布局文件如下

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:background="@color/colorAccent"
    android:layout_height="match_parent">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="这是 FragmentOne"
        android:layout_centerInParent="true">
    </TextView>
</RelativeLayout>


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="这是 FragmentTwo"
        android:layout_centerInParent="true">
    </TextView>
</RelativeLayout>

两个 Fragment 的类文件,留神继承 Androidx 包下的 Fragment,通过重写 onCreateView 办法返回 Fragment 视图,对于 Fragment 的生命周期将会下一篇文章重点介绍。

public class FragmentOne extends Fragment {
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {View view = inflater.inflate(R.layout.fragment_one, container, false);
        return view;
    }
}

public class FragmentTwo extends Fragment {
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {return inflater.inflate(R.layout.fragment_two, container, false);
    }
}

接下来将 Fragment 当作控件退出 MainActivity 布局文件, 留神这里的 id 和 name 必填,否则会报错

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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">
   <LinearLayout
       android:orientation="vertical"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
       <fragment
           android:id="@+id/fragment_one"
           android:layout_width="match_parent"
           android:layout_weight="1"
           android:name="com.snow.fragmentdemo.FragmentOne"
           android:layout_height="match_parent">
       </fragment>
       <fragment
           android:id="@+id/fragment_two"
           android:layout_width="match_parent"
           android:layout_height="match_parent"
           android:layout_weight="1"
           android:name="com.snow.fragmentdemo.FragmentTwo">
       </fragment>
   </LinearLayout>
</FrameLayout>

成果如下

办法二:动静增加



动静加载是应用 FragmentManager 和 FragmentTransaction 提供的 API 实现的,在 Androidx 中通过 getSupportFragmentManager()获取 FragmentManager。

  FragmentManager fm = getSupportFragmentManager();
  FragmentTransaction transaction = fm.beginTransaction();

下表列出了罕用的 API.

FragmentMananger

返回值 函数 形容
Fragment findFragmentById 通过 ID 来获取 Fragment
Fragment findFragmentByTag 通过 Tag 来获取 Fragment
List< Fragment> getFragments 获取所有被增加到 FragmentManager 中的 Fragment
FragmentTransaction beginTransaction 获取 FragmentTransaction

FragmentTransaction

返回值 函数 形容
FragmentTransaction add 向 container 中退出一个 Fragment
FragmentTransaction remove 移除一个 Fragemnt
FragmentTransaction replace 替换 Fragment
FragmentTransaction commit 提交事务
FragmentTransaction show 展现 Fragment
FragmentTransaction hide 暗藏 Fragment
FragmentTransaction addToBackStack 将事物退出回退栈
事项留神
  • replace 是将 FragmentManager 中所有的 Fragment 先移除再退出 Fragment
  • 每一个事物只能提交一次,否则回报错反复提交
  • 调用 addToBackStack 后,按物理回退建会回滚,fragment 页面内容也不会变,如 TextView 里的内容,没有调用,按物理回退建,间接退出 Activity。
  • 一个 commit 能够蕴含多个操作,如 add,remove 等
要害代码
public class MainActivity extends AppCompatActivity implements  View.OnClickListener{

    @Override
    protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        findViewById(R.id.button1).setOnClickListener(this);
        findViewById(R.id.button2).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {FragmentManager fm = getSupportFragmentManager();
        switch (v.getId()) {
            case R.id.button1:
                FragmentTransaction transaction = fm.beginTransaction();
                transaction.replace(R.id.content, new FragmentOne());
                transaction.commit();
                break;
            case R.id.button2:
                FragmentTransaction transaction2 = fm.beginTransaction();
                transaction2.replace(R.id.content, new FragmentTwo()).commit();
                break;
        }
    }
}

最初

点赞就是最大的反对,更多信息关注公众号 QStack,追寻最纯正的技术,享受编程的高兴。

正文完
 0