Fragment的繼承關(guān)系

image
Fragment的實(shí)現(xiàn)方式
- 創(chuàng)建一個(gè)類,繼承Fragment
- 重寫父類的方法onCreateView()
- 在onCreateView()方法中,為Fragment創(chuàng)建UI界面
Java代碼
? MyFragment類
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class MyFragment extends Fragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return getLayoutInflater().inflate(R.layout.fragment_layout, null);
}
}
? MainActivity類
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends AppCompatActivity {
private MyFragment myFragment;
private MyFragment1 myFragment1;
private FragmentManager fragmentManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//創(chuàng)建fragment對(duì)象
myFragment = new MyFragment();
myFragment1 = new MyFragment1();
//獲得fragment的管理類對(duì)象
fragmentManager = getSupportFragmentManager();
//獲得事務(wù)管理者
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
//添加fragment
fragmentTransaction.add(R.id.zhen, myFragment, "嘰里咕嚕");
fragmentTransaction.add(R.id.zhen, myFragment1, "123");
fragmentTransaction.hide(myFragment1);
// //移除fragment
// fragmentTransaction.remove(myFragment);
// //顯示fragment
// fragmentTransaction.show(myFragment);
// //隱藏fragment
// fragmentTransaction.hide(myFragment);
// //替換
// fragmentTransaction.replace(R.id.zhen,myFragment);
//提交事務(wù)
fragmentTransaction.commit();
}
public void show(View view) {
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.show(myFragment1);
fragmentTransaction.commit();
}
public void remove(View view) {
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.remove(myFragment);
fragmentTransaction.commit();
}
public void hide(View view) {
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.hide(myFragment1);
fragmentTransaction.commit();
}
public void replace(View view) {
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.zhen, myFragment);
fragmentTransaction.commit();
}
}
效果圖

image
Fragment的生命周期
- onAttach() Fragment與Activity關(guān)聯(lián)
- onCreate() 創(chuàng)建Fragment
- onCreateView() 創(chuàng)建Fragment視圖
- onActivityCreated() 當(dāng)Activity中的onCreate方法執(zhí)行完后調(diào)用
- onStart() 啟動(dòng)Fragment
- onResume() Fragment可見
- onPause() Fragment不可見
- onStop() Fragment停止
- onDestoryView() 銷毀Fragment視圖
- onDestory() 銷毀Fragment對(duì)象
- onDetach() Fragment和Activity解除關(guān)聯(lián)的時(shí)候調(diào)用
add生命周期執(zhí)行
- onAttach()
- onCreate()
- onCreateView()
- onActivityCreated()
- onStart()
- onResume()
remove時(shí)生命周期執(zhí)行
- onPause()
- onStop()
- onDestoryView()
- onDestory()
- onDetach()
replace時(shí)生命周期執(zhí)行
- 新Fragment --> onAttach()
- 新Fragment --> onCreate()
- 舊Fragment --> onPause()
- 舊Fragment --> onStop()
- 舊Fragment --> onDestroyView()
- 舊Fragment --> onDesttoy()
- 舊Fragment --> onDetach()
- 新Fragment --> onCreateView()
- 新Fragment --> onActivityCreated()
- 新Fragment --> onStart()
- 新Fragment --> onResume()
add時(shí)Fragment和Fctivity的生命周期執(zhí)行
- Activity --> onCreate()
- Fragment --> onAttach()
- Fragment --> onCreate()
- Fragment --> onCreateView()
- Fragment --> onActivityCreated()
- Fragment --> onStart()
- Activity --> onResume()
- Fragment --> onResume()
Fragment的回退棧
Activity切換時(shí)是通過棧的形式,不斷壓棧出棧,在Fragment的時(shí)候,如果你不是手動(dòng)開啟回退棧,它是直接銷毀再重建,但如果將Fragment任務(wù)添加到回退棧,情況就會(huì)不一樣了,它就有了類似Activity的棧管理方式。
實(shí)現(xiàn)
MyFragment myFragment1 = new MyFragment();
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
//添加到回退棧
fragmentTransaction.addToBackStack("1");
fragmentTransaction.commit();
回退
//回退一個(gè)
fragmentManager.popBackStack();
//立刻回退一個(gè)
fragmentManager.popBackStackImmediate();
Fragment的傳值
setArguments() & getArguments()
MyFragment類
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
public class MyFragment extends Fragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = getLayoutInflater().inflate(R.layout.fragment_layout, null);
view.findViewById(R.id.send).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Bundle bundle = new Bundle();
bundle.putString("key","我是fragment發(fā)送過來的數(shù)據(jù)");
MyFragment.this.setArguments(bundle);
}
});
return view;
}
Activity類
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
public class MainActivity extends AppCompatActivity {
MyFragment myFragment = new MyFragment();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void show(View view) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.frameLayout, myFragment, "name");
fragmentTransaction.commit();
}
public void receive(View view) {
Bundle bundle = myFragment.getArguments();
String key = bundle.getString("key");
if (key != null) {
Toast.makeText(this, key, Toast.LENGTH_SHORT).show();
}
}
}
? 效果圖

image
handler傳值
MyFragment類
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
public class MyFragment extends Fragment {
private Handler handler;
public MyFragment(Handler handler) {
this.handler = handler;
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = getLayoutInflater().inflate(R.layout.fragment_layout, null);
view.findViewById(R.id.send).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Message message = Message.obtain();
message.what = 1;
message.obj = "我是fragment發(fā)送過來的數(shù)據(jù)";
handler.sendMessage(message);
}
});
return view;
}
}
Activity類
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
public class MainActivity extends AppCompatActivity {
Handler handler = new Handler(){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
switch (msg.what){
case 1:
Toast.makeText(MainActivity.this, (String)msg.obj, Toast.LENGTH_SHORT).show();
break;
}
}
};
MyFragment myFragment = new MyFragment(handler);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void show(View view) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.frameLayout, myFragment, "name");
fragmentTransaction.commit();
}
}
? 效果圖

image
接口回調(diào)傳值
MyFragment
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
public class MyFragment extends Fragment {
private EditText input;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
//設(shè)置布局
View view = getLayoutInflater().inflate(R.layout.fargment, null);
input = view.findViewById(R.id.input);
return view;
}
//接口回調(diào)
public void getEditText(Interface i){
String msg = input.getText().toString();
i.getInput(msg);
}
//接口
public interface Interface{
public void getInput(String msg);
}
}
MainActivity類
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
public class MainActivity extends AppCompatActivity {
private MyFragment fragment;
private FragmentManager fragmentManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fragment = new MyFragment();
fragmentManager = getSupportFragmentManager();
}
//添加fragment
public void show(View view) {
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.framelayout,fragment,"123");
fragmentTransaction.addToBackStack("123");
fragmentTransaction.commit();
}
public void receive(View view) {
//使用接口回調(diào)的方法獲取數(shù)據(jù)
fragment.getEditText(new MyFragment.Interface() {
@Override
public void getInput(String msg) {
Toast.makeText(MainActivity.this, "輸入了 --->"+msg, Toast.LENGTH_SHORT).show();
}
});
}
}
效果圖

image