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发送信息:
//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必须是依存与Activity而存在的,因此Activity的生命周期会直接影响到Fragment的生命周期。
onAttach(Activity)
当Fragment与Activity发生关联时调用。
onCreateView(LayoutInflater, ViewGroup,Bundle)
创建该Fragment的视图
onActivityCreated(Bundle)
当Activity的onCreate方法返回时调用
onDestoryView()
与onCreateView对应,当该Fragment的视图被移除时调用
onDetach()
与onAttach相对应,当Fragment与Activity关联被取消时调用
上一篇: 紫书第三章例题--UVa272