第五天 Fragment高级进阶
Fragment高級進階
- 一、Fragment回退棧
- 二、Fragment傳值介紹
- 1.activity 給 fragment傳值
- 2.fragment 給 activity傳值
- 1.第一種
- 2.第二種
- 3.fragment 給 fragment 傳值(共3中)
- 案例(微信底部按鈕與fragment實現界面切換)
一、Fragment回退棧
package com.example.a04utll;import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction;import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button;public class Main2Activity extends AppCompatActivity {private Button btnTz;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main2);btnTz = (Button) findViewById(R.id.btn_tz);//管理者final FragmentManager fragmentManager = getSupportFragmentManager();//事務FragmentTransaction transaction = fragmentManager.beginTransaction();//對象BlankFragment1 blankFragment1 = new BlankFragment1();//添加碎片transaction.add(R.id.ll,blankFragment1);//將fragment放入回退棧中transaction.addToBackStack("1");//手動彈出棧fragmentManager.popBackStack();//提交事務transaction.commit();btnTz.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Intent intent = new Intent(Main2Activity.this, MainActivity.class);startActivity(intent);}});} }二、Fragment傳值介紹
1.activity 給 fragment傳值
主要涉及到一個方法是getArguments()和setArguments().
一個設置屬性值,一個去取屬性值.
步驟:
要傳的值,放到bundle對象里;
在Activity中創建該Fragment的對象fragment,通過調用
fragment.setArguments()傳遞到fragment中;
然后更新fragment.
在該Fragment中通過調用getArguments()得到bundle對象,就能得到里面的值。
activity代碼
package com.example.a05utill;import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction;import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.FrameLayout;public class MainActivity extends AppCompatActivity {private EditText mEtt1;private Button mBtnSend;private FrameLayout mForever;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mEtt1 = (EditText) findViewById(R.id.ett_1);mBtnSend = (Button) findViewById(R.id.btn_send);mForever = (FrameLayout) findViewById(R.id.f1);final FragmentManager fragmentManager = getSupportFragmentManager();final FragmentTransaction transaction = fragmentManager.beginTransaction();BlankFragment blankFragment = new BlankFragment();transaction.add(R.id.f1,blankFragment);transaction.commit();mBtnSend.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {//獲取輸入的值String s = mEtt1.getText().toString();//創建fragment對象BlankFragment blankFragment = new BlankFragment();//創建bundleBundle bundle = new Bundle();bundle.putString("name",s);//給fragment對象賦值blankFragment.setArguments(bundle);//修改fragmentFragmentManager fragmentManager = getSupportFragmentManager();FragmentTransaction transaction = fragmentManager.beginTransaction();transaction.add(R.id.f1,blankFragment);transaction.commit();}});} }fragmenty代碼
package com.example.a05utill;import android.os.Bundle;import androidx.fragment.app.Fragment;import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView;/*** A simple {@link Fragment} subclass.*/ public class BlankFragment extends Fragment {private TextView mTtv;public BlankFragment() {// Required empty public constructor}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// Inflate the layout for this fragment//獲取視圖View view = inflater.inflate(R.layout.fragment_blank, null);//通過視圖尋找控件mTtv = view.findViewById(R.id.ttv);//獲取bundleBundle bundle = getArguments();if (bundle != null) {String string = bundle.getString("name");mTtv.setText(string);}return view;}}2.fragment 給 activity傳值
1.第一種
在Activity中調用getFragmentManager()得到fragmentManager,,調用findFragmentByTag(tag)或者通過findFragmentById(id)
FragmentManager fragmentManager = getFragmentManager();
Fragment fragment = fragmentManager.findFragmentByTag(tag);
2.第二種
通過回調的方式,定義一個接口(可以在Fragment類中定義),接口中有一個空的方法,在fragment中需要的時候調用接口的方法,值可以作為參數放在這個方法中,然后讓Activity實現這個接口,必然會重寫這個方法,這樣值就傳到了Activity中.
大白話,就是java的父類引用指向了子類對象
activity代碼
package com.example.day004;import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView;import com.example.day004.fragment.ShowTitleFragment;public class F2AActivity extends AppCompatActivity implements ShowTitleFragment.MyListener {private TextView textView;@Overridepublic void sendMessage(String string) {textView.setText(string);}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_f_2_a);textView = findViewById(R.id.f2a_tv_id);} }fragmenty代碼
package com.example.day004.fragment;import android.content.Context; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText;import com.example.day004.R;/*** A simple {@link Fragment} subclass.*/ public class ShowTitleFragment extends Fragment {private EditText editText;private Button button;private MyListener listener;public ShowTitleFragment() {// Required empty public constructor}@Overridepublic void onAttach(Context context) {super.onAttach(context);//拿到與當前fragment關聯的Activity.listener = (MyListener) getActivity(); }@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {View inflate = inflater.inflate(R.layout.fragment_show_title, container, false);//初始化所有控件editText = inflate.findViewById(R.id.fm_title_et_id);button = inflate.findViewById(R.id.fm_title_button_id);//設置點擊監聽button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String string = editText.getText().toString();if(string != null){//父類引用指向了子類對象,activity中的sendmessage方法執行.listener.sendMessage(string);}}});//返回fragment中的視圖return inflate;}//自定義的接口public interface MyListener{void sendMessage(String string);} }3.fragment 給 fragment 傳值(共3中)
1.第一種
動態創建的fragment通過findFragmentByTag得到另一個的Fragment的對象,這樣就可以調用另一個的方法了。
靜態創建的fragment通過findFragmentById得到另一個的Fragment的對象,這樣就可以調用另一個的方法了。
2.第二種、
通過接口回調的方式。
與上面的接口回調用法相同
3.第三種
通過setArguments,getArguments的方式。
案例(微信底部按鈕與fragment實現界面切換)
package com.example.day004.activities;import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.widget.FrameLayout; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.Toast;import com.example.day004.R; import com.example.day004.fragment.FristFragment; import com.example.day004.fragment.SecondFragment;/*** 底部導航*/ public class SelectActivity extends AppCompatActivity {private FrameLayout frameLayoutId;private RadioGroup radioGroupId;private RadioButton personId;private RadioButton messageId;private static final String TAG = "SelectActivity";private FragmentManager manager;private FragmentTransaction fragmentTransaction;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_select);frameLayoutId = findViewById(R.id.frame_layout_id);radioGroupId = findViewById(R.id.radio_group_id);radioGroupId.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(RadioGroup group, int checkedId) {switch (checkedId) {case R.id.person_id:manager = getSupportFragmentManager();fragmentTransaction = manager.beginTransaction(); // fragmentTransaction.replace(R.id.frame_layout_id,new FristFragment());fragmentTransaction.add(R.id.frame_layout_id,new FristFragment());fragmentTransaction.addToBackStack("11");Log.i(TAG, "onCheckedChanged: "+SelectActivity.class.getName());fragmentTransaction.commit();break;case R.id.message_id:manager = getSupportFragmentManager();manager.popBackStack();SelectActivity.this.fragmentTransaction = manager.beginTransaction();SelectActivity.this.fragmentTransaction.replace(R.id.frame_layout_id,new SecondFragment()); // fragmentTransaction.addToBackStack(null);SelectActivity.this.fragmentTransaction.commit();break;default:break;}}});} }總結
以上是生活随笔為你收集整理的第五天 Fragment高级进阶的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux学习笔记(1)-初识终端(打开
- 下一篇: 与时间做朋友