Android开发——Fragment

发布于:2024-04-24 ⋅ 阅读:(152) ⋅ 点赞:(0)

Demo

fragment_blank.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >
    <TextView
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:text="@string/app_name"
        android:id="@+id/tv">
    </TextView>
    <Button
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:id="@+id/btn"/>
</LinearLayout>

fragment_blank.java

package com.example.myapplication;

import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;

/**
 * A simple {@link Fragment} subclass.
 * Use the {@link BlankFragment#} factory method to
 * create an instance of this fragment.
 */

public class BlankFragment extends Fragment {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        if(root==null)
        {
            root = inflater.inflate(R.layout.fragment_blank,container,false);
        }
        textView = root.findViewById(R.id.tv);
        Button button = root.findViewById(R.id.btn);
        button.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v) {
                textView.setText("OK");
            }
        });
        return root;
    }

    private View root;
    private TextView textView;
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:id="@+id/main"
    android:orientation="vertical">
    <androidx.fragment.app.FragmentContainerView android:name="com.example.myapplication.BlankFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/fg"/>
    </LinearLayout>

绑定fragment 

动态添加

main_activity.mxl

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:id="@+id/main"
    >
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btn1"
        android:text="@string/app_name"/>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btn2"
        android:text="@string/bottom_sheet_behavior"/>
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/fl"
        android:background="@drawable/ic_launcher_background"/>
    </LinearLayout>

Activity_main.java

package com.example.myapplication;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main);
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });
        Button btn = findViewById(R.id.btn1);
        btn.setOnClickListener(this);
        Button btn2 = findViewById(R.id.btn2);
        btn2.setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
        if(v.getId()==R.id.btn1)
        {
            replaceFragment(new BlankFragment2());
        }
        else
        {
            replaceFragment(new ItemFragment());
        }
    }
    // 动态切换
    private void replaceFragment(Fragment blankFragment2) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.replace(R.id.fl,blankFragment2);
        transaction.commit();
    }
}

 

点击按钮,Fragment对象会被替换到下方FrameLayout容器上。

除了替换,还有很多操作 Fragment对象的方法。

其中将Fragment压入同一个栈的操作,可以通过按返回键依次出栈:

Activity和Fragment通信(Bundle方案)

MainActivity.java:

public void onClick(View v) {
        if(v.getId()==R.id.btn1)
        {
            Bundle bundle = new Bundle();
            bundle.putString("111","222");
            BlankFragment2 blankFragment2 = new BlankFragment2();
            blankFragment2.setArguments(bundle);
            replaceFragment(blankFragment2);
        }
        else
        {
            replaceFragment(new ItemFragment());
        }
    }

按按钮之后将数据传给Fragment对象。

BlankFragment2.java

 public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
     // Inflate the layout for this fragment
     View view = inflater.inflate(R.layout.fragment_blank2, container, false);
     TextView textView = view.findViewById(R.id.fb2);
     Bundle bundle = this.getArguments();
     assert bundle != null;
     String ret = bundle.getString("111");
     // ret存放的就是传过来的参数的值
     textView.setText(ret);
     return view;
   }
}

生命周期

PS:

onDestroyView函数一般在当前UI界面不需要显示时才会调用。而切回主屏幕不会导致UI销毁所以不调用该函数。onCreateView相反。


网站公告

今日签到

点亮在社区的每一天
去签到