Android从入门到入坟(三)

第四章

1、什么是碎片

碎片(Fragment)是一种可以嵌入在活动中的Ui片段

用于更好的利用空间

2、碎片的简单用法

1、首先我们添加一个平板模拟器
2、创建一个 FragmentTest 的项目
3、首先我们 准备在该项目中添加两个碎片

首先先创建左右两个布局

首先为ledt_fragment布局,其次为 right_fragment 布局

4、再为他们创建两个java实例文件

Left_Fragment和 Right_Fragment

两个实例文件都继承Fragment该控件

引入的包为【 import androidx.fragment.app.Fragment; 】

5、分别将各自的xml布局文件引入

代码如下:

public class Left_Fragment extends Fragment {
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view=inflater.inflate(R.layout.fragment_left,container,false);
        return view;
    }
}
public class Right_Fragment extends Fragment {
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view=inflater.inflate(R.layout.fragment_right,container);
        return view;
    }
}
6、然后再在main_activity.xml 文件中引入

代码如下

<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="horizontal">
    <fragment
        android:id="@+id/left_fragment"
        android:name="com.example.fragmenttest.Left_Fragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"/>
    <fragment
        android:id="@+id/right_fragment"
        android:name="com.example.fragmenttest.Right_Fragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"/>
</LinearLayout>

3、动态添加碎片

我们将通过 button 控件实现简单的动态添加碎片

首先我们重新创建一共 another_rigth_fragment.xml 文件

然后对其简单的布局

但后再次 创建一个 AnotherRightActivit.java 的实例类

并且引用 another_rigth_fragment.xml 文件

代码代码如下

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

再像activity_main中添加一个FrameLayout布局,并且将其 替换掉 main_activity.xml 文件中id 为 right_fragment 的fragment 控件

FrameLayout布局中不需要任何东西

代码如下

<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="horizontal">
    <fragment
        android:id="@+id/left_fragment"
        android:name="com.example.fragmenttest.Left_Fragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"/>
    <FrameLayout
        android:id="@+id/right_layout"
        android:layout_weight="1"
        android:layout_width="0dp"
        android:layout_height="match_parent">

    </FrameLayout>
</LinearLayout>

然后我们返回MainActivity 实例类中

为fragment_left中Button 添加点击时间 与一些替换配置

代码如下

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 初始化 使用 Right_Fragment替换 main_layout 布局
        replaceFragment(new  Right_Fragment());
        Button bnt=findViewById(R.id.fragment_left_btn);
        // 通过 按钮的点击id 换成不同布局文件
        bnt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                switch(view.getId()) {
                    case (R.id.fragment_left_btn):
                        replaceFragment(new AnotherRightActivity());
                        break;
                    default:
                        break;
                    }
                }
             });
    }
    // 用于进行替换
    public void replaceFragment(Fragment fragment){
        // 通过getSupportFragmentManager获取碎片的实例信息
        FragmentManager fragmentManager=getSupportFragmentManager();
        // 通过beginTransaction方法开始一个FragmentTransaction容器事务
        FragmentTransaction Transaction=fragmentManager.beginTransaction();
        // 通过replace方法将FragmentTransaction容器中的内容替换
        // L两个参数 第一个是被替换的容器 第二个参数是替换是传入的替换容器
        Transaction.replace(R.id.right_layout,fragment);
        // 替换完毕之后 使用 commit()方法进行提交
        Transaction.commit();
    }
}

4、使用碎片模拟返回栈

在事物中我们使用back键会直接销毁程序 无法返回到上一次的碎片

在FragmentTransaction中提供了一个addToBackStart()的方法可以将我们实现的碎片容器

添加到我们的返回栈中

代码如下

public void replaceFragment(Fragment fragment){
        FragmentManager fragmentManager=getSupportFragmentManager();
        FragmentTransaction Transaction=fragmentManager.beginTransaction();
        Transaction.replace(R.id.right_layout,fragment);
        Transaction.addToBackStack(null);
        Transaction.commit();
public void replaceFragment(Fragment fragment){
        FragmentManager fragmentManager=getSupportFragmentManager();
        FragmentTransaction Transaction=fragmentManager.beginTransaction();
        Transaction.replace(R.id.right_layout,fragment);
        Transaction.addToBackStack(null);
        Transaction.commit();
    }    }

addTobackStart中传入参数null即可 该参数用于描述该碎片容器的状态

5、碎片之间与活动的通信

在上面的学习中我们可以知道每一个碎片的内容都是单独独立的类

我们需要掌握两种获取实例的方法

1、获取碎片的实例方法

代码如下

RightFrament right=getFramentManager().findFramentById(R.id.id)

在Frament类中提供了一种类似FindViewById的方法 findFramentById()

2、获取活动中的实例方法

代码如下

MainActivity activity=getActivity();

只要是活动都可以通过 getActivity获取

6、碎片的生命周期

1、碎片的状态

碎片中也存在四个状态与活动状态一致

1、运行状态

当一个碎片处于可见时并且与他相关联的活动也处于与逆行状态时

则这个碎片也处于运行状态

2、暂停状态

当一个活动进入了暂停状态时(另外一个活动处于栈顶,而为沾满全屏)

与他相关联的碎片便会进入暂停状态

3、停止状态

当一个活动进入停止状态时,与她相关的碎片也会进入停滞状态

可以通过 Fragment Transaction中的remove()或者Replace()方法将碎片从活动中移出

如果调用了addToBackStack()方法 碎片进入停止状态后 可能被系统回收

4、销毁状态

碎片是依附于活动的容器,活动被销毁时碎片也会被销毁

也可以通过repalce()或者remove()方法对其删除、

如果在事物提交之前未调用addToBackStarck()方法 随便也会进入销毁状态

2、碎片的回调方法

1、onAttach() 当碎片与活动建立联系时进行调用

2、onCreateView()为碎片创建视图(加载布局)时调用

3、onActivityCreated() 确保与碎片相关联的活动一定已经创建完毕时进行调用

4、onDetach()当活动与碎片解除关联时调用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值