Fragment碎片

Fragment的繼承關(guān)系

image

Fragment的實(shí)現(xiàn)方式

  1. 創(chuàng)建一個(gè)類,繼承Fragment
  2. 重寫父類的方法onCreateView()
  3. 在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的生命周期

  1. onAttach() Fragment與Activity關(guān)聯(lián)
  2. onCreate() 創(chuàng)建Fragment
  3. onCreateView() 創(chuàng)建Fragment視圖
  4. onActivityCreated() 當(dāng)Activity中的onCreate方法執(zhí)行完后調(diào)用
  5. onStart() 啟動(dòng)Fragment
  6. onResume() Fragment可見
  7. onPause() Fragment不可見
  8. onStop() Fragment停止
  9. onDestoryView() 銷毀Fragment視圖
  10. onDestory() 銷毀Fragment對(duì)象
  11. onDetach() Fragment和Activity解除關(guān)聯(lián)的時(shí)候調(diào)用

add生命周期執(zhí)行

  1. onAttach()
  2. onCreate()
  3. onCreateView()
  4. onActivityCreated()
  5. onStart()
  6. onResume()

remove時(shí)生命周期執(zhí)行

  1. onPause()
  2. onStop()
  3. onDestoryView()
  4. onDestory()
  5. onDetach()

replace時(shí)生命周期執(zhí)行

  1. 新Fragment --> onAttach()
  2. 新Fragment --> onCreate()
  3. 舊Fragment --> onPause()
  4. 舊Fragment --> onStop()
  5. 舊Fragment --> onDestroyView()
  6. 舊Fragment --> onDesttoy()
  7. 舊Fragment --> onDetach()
  8. 新Fragment --> onCreateView()
  9. 新Fragment --> onActivityCreated()
  10. 新Fragment --> onStart()
  11. 新Fragment --> onResume()

add時(shí)Fragment和Fctivity的生命周期執(zhí)行

  1. Activity --> onCreate()
  2. Fragment --> onAttach()
  3. Fragment --> onCreate()
  4. Fragment --> onCreateView()
  5. Fragment --> onActivityCreated()
  6. Fragment --> onStart()
  7. Activity --> onResume()
  8. 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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容