【Android UI】Fragment的创建、添加、删除,生命周期

基础知识:
什么是fragment:

  • fragment是activity的界面中的一部分
  • 多个fragment们组合到一个activity中
  • 多个fragment可以重用一个activity

总结:

  • fragment相当于模块化的一段activity
  • 具有自己的生命周期,接收自己的事件
  • 在activity运行时被添加或删除

为什么使用fragment:

  • 支持更动态更灵活的界面设计
  • 在平板上使用
  • activity的layout被分成fragment

0、新建Fragment

TestFragment.java

package com.jsc4.aboutactivity;

import android.os.Bundle;

import androidx.fragment.app.Fragment;

import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

/**
 * A simple {@link Fragment} subclass.
 * Use the {@link TestFragment#newInstance} factory method to
 * create an instance of this fragment.
 */
public class TestFragment extends Fragment {
    
    

    public static final String TAG = TestFragment.class.getSimpleName();
    // TODO: Rename parameter arguments, choose names that match
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";

    // TODO: Rename and change types of parameters
    private String mParam1;
    private String mParam2;

    public TestFragment() {
    
    
        // Required empty public constructor
    }

    /**
     * Use this factory method to create a new instance of
     * this fragment using the provided parameters.
     *
     * @param param1 Parameter 1.
     * @param param2 Parameter 2.
     * @return A new instance of fragment TestFragment.
     */
    // TODO: Rename and change types and number of parameters
    public static TestFragment newInstance(String param1, String param2) {
    
    
        TestFragment fragment = new TestFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
    
    
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }
        Log.i(TAG, "onCreate");
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
    
    
        Log.i(TAG, "onCreateView");
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_test, container, false);//从xml得到一个view
        TextView textView = view.findViewById(R.id.test_text_view);//获得了view后,可以从中得到控件
        textView.setText("just test");//进而修改控件的属性
        return view;
    }

    @Override
    public void onPause() {
    
    
        super.onPause();
        Log.i(TAG, "onPause");
    }

    @Override
    public void onDestroy() {
    
    
        super.onDestroy();
        Log.i(TAG, "onDestroy");
    }
}

xml:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/red"
    tools:context=".TestFragment">

    <!-- TODO: Update blank fragment layout -->
    <TextView
        android:id="@+id/test_text_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="@string/hello_blank_fragment" />
</FrameLayout>

1、创建Activity用于存放fragment

新建TestFragmentActivity
java文件:

package com.jsc4.aboutactivity;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

public class TestFragmentActivity extends AppCompatActivity {
    
    

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test_fragment);
    }
}

xml文件:

<?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"
    android:orientation="vertical"
    android:background="@color/colorAccent"
    tools:context=".TestFragmentActivity">

</LinearLayout>

2、通过XML添加fragment

在Activity的xml文件中添加fragment:

<?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"
    android:orientation="vertical"
    android:background="@color/colorAccent"
    tools:context=".TestFragmentActivity">

    <fragment
        android:id="@+id/fragment_test1"
        android:name="com.jsc4.aboutactivity.TestFragment"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        />

    <fragment
        android:id="@+id/fragment_test2"
        android:name="com.jsc4.aboutactivity.TestFragment"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        />

    <fragment
        android:id="@+id/fragment_test3"
        android:name="com.jsc4.aboutactivity.TestFragment"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        />

</LinearLayout>

3、通过java添加fragment

总结:

查找fragment:
findFragmentById()
findFragmentByTag()

Fragment的后退:
Fragment Stack
popBackStack()
addOnBackStackChangedListener()

总结:
FragmentManager
FragmentTransaction
Add
Remove

通过java添加fragment:

package com.jsc4.aboutactivity;

import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;

import android.os.Bundle;

public class TestFragmentActivity extends AppCompatActivity {
    
    

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test_fragment);
	
		关键代码在这里:
		
        FragmentManager fragmentManager = getSupportFragmentManager();  // 找到校长
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();  // 找到秘书

        TestFragment testFragment = TestFragment.newInstance(null, null);  // 创建一个fragment
        fragmentTransaction.add(R.id.fragment_view, testFragment).commit();  // 最后要commit,向校长汇报
    }
}

4、通过java删除fragment:

只能commit一次:

package com.jsc4.aboutactivity;

import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;

import android.os.Bundle;

public class TestFragmentActivity extends AppCompatActivity {
    
    

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test_fragment);
	
		关键代码在这里:
		
        FragmentManager fragmentManager = getSupportFragmentManager();  // 找到校长
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();  // 找到秘书

       TestFragment testFragment = TestFragment.newInstance(null, null);  // 创建一个fragment
        fragmentTransaction.add(R.id.fragment_view, testFragment);  // 只需commit一次

        fragmentTransaction.remove(testFragment).commit();  // 最后要commit,向校长汇报
    }
}

5、通过java找到fragment

通过Id找到fragment:

添加方式为:
fragmentTransaction.add(R.id.fragment_view, testFragment);  // 全局只需commit一次


查找方式为:
Fragment fragment = fragmentManager.findFragmentById(R.id.fragment_test1);  // 找到fragment
if(fragment instanceof TestFragment){
    
    
    // 如果是TestFragment类型
    Log.i(TAG, "onCreate:fragment类型是TestFragment");
}else{
    
    
    throw new IllegalStateException("this is not TestFragment");
}

通过tag找到fragment:

添加方式为:
fragmentTransaction.add(R.id.fragment_view, testFragment, "test_fragment_view");//通过tag的方式添加实例


查找方式为:        
Fragment fragment1 = fragmentManager.findFragmentByTag("test_fragment_view");  // 通过tag找到fragment

6、Fragment的生命周期

在这里插入图片描述
Activity生命周期:
在这里插入图片描述

两者对比:
在这里插入图片描述

fragment的3种状态:Resumed(与用户交互)、Paused(被暂停)、Stoped(被停止)

猜你喜欢

转载自blog.csdn.net/qq_30885821/article/details/108812874