欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Fragment完全总结

程序员文章站 2022-06-09 19:02:29
...

一.动态添加fragment

第一步,动态创建管理器对象

第二步,获取fragment的事务对象并开启

第三步,调用事务中相应的动态操作fragment方法的执行

第四步,提交事务

Fragment完全总结

二.静态添加fragment

1、继承Fragment,重写onCreateView决定Fragemnt的布局

2、在Activity中声明此Fragment,就当和普通的View一样

三.fragment向fragment传值

同一个activity中不同Fragment之间传值:

1.调用getFragmentManager().findFragmentById()获取fragment对象调用方法

2.getFragmentManager().findFragmentById().getView().findViewById()根据ID获取视图中的控件对象

3.getActivty().findviewById()获取当前所属activity根据Id获取view对象

下面的案例演示了静态向同一个Activity中植入两个(一左一右)fragment,左边fragment向右边fragment发送信息:

Fragment完全总结

//fragmentleft.java
package com.example.fragmenttofragment;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

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

public class fragmentLeft extends Fragment {
    private EditText et;
    private Button btn;
    @Nullable
    @Override

    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
      View view=inflater.inflate(R.layout.fragment_left,null);
      et=view.findViewById(R.id.et);
      btn=view.findViewById(R.id.button);
      btn.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
              String str=et.getText().toString().trim();
              //方式一
            //  fragmentRight fragmentRight=
                     // (com.example.fragmenttofragment.fragmentRight) getFragmentManager().findFragmentById(R.id.rightFragment);
            // fragmentRight.setTextView(str);

              //方式二
            //  TextView tv=getFragmentManager().findFragmentById(R.id.rightFragment).
                   //  getView().findViewById(R.id.tv);
            //  tv.setText(str);

              //方式三
              TextView tv=getActivity().findViewById(R.id.tv);
              tv.setText(str);
          }
      });
      return view;
    }
}
//fragmentRight.java中
 public void setTextView(String str){
      tv.setText(str);
    }
//main.xml中
<?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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    tools:context=".MainActivity">
    <fragment
        android:id="@+id/leftFragment"
        android:name="com.example.fragmenttofragment.fragmentLeft"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"/>
    <fragment
        android:id="@+id/rightFragment"
        android:name="com.example.fragmenttofragment.fragmentRight"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"/>
</LinearLayout>

 

 

 

四.fragment传值给activity

fragment向所在activity传值步骤:1.fragment中定义传值的回调接口,在生命周期的onAttach()或者onCreate()方法中获取接口的实现

2.fragment需要传值的位置调用接口方法回调方法传值

3.activity实现接口重调方法获取传递的值

下面是一个简单的小案例:

//fragment.java
package com.example.fragtoac;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;

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

public class fragment extends Fragment {
    private EditText et;
    private Button btn;
    private MyListener listener;
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        listener= (MyListener) getActivity();
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view=inflater.inflate(R.layout.fragment,null);
        et = view.findViewById(R.id.et);
        btn=view.findViewById(R.id.btn);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String s=et.getText().toString().trim();
                listener.sendMessage(s);
            }
        });
        return view;
    }
public interface MyListener{
      public abstract void sendMessage(String str);
    }
}
package com.example.fragtoac;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity implements fragment.MyListener {
   private TextView tv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv=findViewById(R.id.tv);
    }

    @Override
    public void sendMessage(String str) {
        if(str!=null&&!"".equals(str)){
            tv.setText(str);
        }
    }
}
<?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"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="textview"
        android:id="@+id/tv" />
<fragment
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:name="com.example.fragtoac.fragment"
    android:id="@+id/frag"/>
</LinearLayout>

 

 

五.activity传值给fragment

第一步,activity中创建fragment对象,调用setArguments(bundle)方法存储值

第二步,fragment中调用getArguments()获取传递的bundle对象,解析获取具体值

 FragmentManager manager = getFragmentManager();
        transation = manager.beginTransaction();
        transation.add(R.id.fl,new resultfragment());
        transation.commit();
    }
    public void sendvalue(View view){
      String info=et.getText().toString().trim();
      resultfragment rf=new resultfragment();
      Bundle bundle=new Bundle();
      bundle.putString("info",info);
      rf.setArguments(bundle);
    }

 Fragment完全总结

六.fragment的生命周期

Fragment必须是依存与Activity而存在的,因此Activity的生命周期会直接影响到Fragment的生命周期。

Fragment完全总结

onAttach(Activity)
当Fragment与Activity发生关联时调用。
onCreateView(LayoutInflater, ViewGroup,Bundle)
创建该Fragment的视图
onActivityCreated(Bundle)
当Activity的onCreate方法返回时调用
onDestoryView()
与onCreateView对应,当该Fragment的视图被移除时调用
onDetach()
与onAttach相对应,当Fragment与Activity关联被取消时调用 

相关标签: Android