Fragment 是什么

本文详细介绍了Fragment的概念及使用方式,包括静态加载、动态加载等,并通过示例代码展示了如何在Activity中添加、替换、隐藏和显示Fragment。此外,还介绍了Fragment的生命周期及其在页面切换中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Fragment:

是一种可以嵌入在Activity中的 UI 片段,它能让程序更加合理和充分地利用大屏幕的空间,因而在平板和目前的大屏手机上应用的非常广泛(只要屏幕大,都会用到Fragment)。一般运用在编写平板

简单创建fragment:

先创建一个Fragment静态加载

package com.example.myrun.fragmentpage;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.example.myrun.R;

/**
 * A simple {@link Fragment} subclass.
 */
public class FriendFragment extends Fragment {
    public FriendFragment() {
        // Required empty public constructor
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_friend, container, false);
    }

}

fragment_layout

<FrameLayout 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:background="#44ff55"
    tools:context="com.example.myrun.fragmentpage.FirstFragment">

    <!-- TODO: Update blank fragment layout -->
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="@string/hello_blank_fragment" />

</FrameLayout>

MainActivity

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    private FragmentManager fragmentManager;
    private FragmentTransaction fragmentTransaction;
    private FirstFragment firstFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        fragmentManager=getFragmentManager();
        fragmentTransaction=fragmentManager.beginTransaction();
    }

main_layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >
    <fragment
        android:id="@+id/fragment_a"
        android:name="com.example.myrun.fragmentpage.FirstFragment"/>
        android:layout_width="match_parent"
        android:layout_height="200dp"/>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/bttona"
        android:text="调用fragmwntA"/>
</LinearLayout>

Fragment动态加载怎么用

transaction.add()

往Activity中添加一个Fragment

transaction.remove()

从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈,这个Fragment实例将会被销毁;数据会被销毁。

transaction.replace()

使用另一个Fragment替换当前的,实际上就是remove()然后add()的合体。

transaction.hide();transaction.show()

隐藏当前的Fragment,仅仅是设为不可见,并不会销毁,显示之前隐藏的Fragment,数据不会销毁。

MainActivity

import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import com.example.myrun.fragmentpage.FirstFragment;
import com.example.myrun.fragmentpage.SecondFragment;
import com.example.myrun.fragmentpage.UsersFragment;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    private Button button1,button2,button3;
    private FragmentManager fragmentManager;
    private FragmentTransaction fragmentTransaction;
    private FirstFragment firstFragment;
    private SecondFragment secondFragment;
    private UsersFragment usersFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();

        fragmentManager=getFragmentManager();
        fragmentTransaction=fragmentManager.beginTransaction();
    }

    private void init() {
        button1=(Button) findViewById(R.id.main_one);
        button2= (Button) findViewById(R.id.main_two);
        button3= (Button) findViewById(R.id.main_three);
        button1.setOnClickListener(this);
        button2.setOnClickListener(this);
        button3.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        fragmentTransaction=fragmentManager.beginTransaction();
        switch (v.getId()){
            case R.id.main_one:
                if (firstFragment==null){
                    firstFragment=new FirstFragment();
                }
                fragmentTransaction.replace(R.id.main_frame,firstFragment);
                break;
            case R.id.main_two:
                if (secondFragment==null){
                    secondFragment=new SecondFragment();
                }
                fragmentTransaction.replace(R.id.main_frame,secondFragment);
                break;
            case R.id.main_three:
                if (usersFragment==null){
                    usersFragment=new UsersFragment();
                }
                fragmentTransaction.replace(R.id.main_frame,usersFragment);
                break;
        }
        fragmentTransaction.commit();
    }
}

main_layout

<?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:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.myrun.MainActivity">
    <FrameLayout
        android:id="@+id/main_frame"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="9">
    </FrameLayout>

    <LinearLayout
        android:id="@+id/main_layout"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal">
        <Button
            android:id="@+id/main_one"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:text="按钮一"/>

        <Button
        android:id="@+id/main_two"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:text="按钮二"/>

        <Button
            android:id="@+id/main_three"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:text="按钮三"/>
    </LinearLayout>

</LinearLayout>

firstFragmentlayout

<FrameLayout 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:background="#44ff55"
    tools:context="com.example.myrun.fragmentpage.FirstFragment">

    <!-- TODO: Update blank fragment layout -->
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="@string/hello_blank_fragment" />

</FrameLayout>

FirstFragment

public class FirstFragment extends Fragment {
    private static final String TAG = "FirstFragment";
    public FirstFragment() {
        // Required empty public constructor
    }

    @Override
    public void onAttach(Context context) {
        Log.d(TAG, "onAttach: ");
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_first, container, false);
    }

ViewPager+Fragment实现页面切换

1,在主页面布局中导入v4下的ViewPager

2,创建适配器继承FragmentPagerAdapter

3,实现滑动切换功能

<android.support.v4.view.ViewPager
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/main2_vp"></android.support.v4.view.ViewPager>
public class WeixinAdapter extends FragmentPagerAdapter {
    private List<Fragment> fragmentList;

    public WeixinAdapter(FragmentManager fm ,List<Fragment> fragmentList) {
        super(fm);
        this.fragmentList=fragmentList;
    }

    @Override
    public Fragment getItem(int position) {
        return fragmentList.get(position);
    }

    @Override
    public int getCount() {
        return fragmentList.size();
    }
}
public class Main2Activity extends AppCompatActivity implements View.OnClickListener{

    private ViewPager viewPager;
    private List<Fragment> fragmentList=new ArrayList<>();
    private ContactFragment contactFragment;
    private FriendFragment friendFragment;
    private ChatFragment chatFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        viewPager= (ViewPager) findViewById(R.id.main2_vp);

        chatFragment=new ChatFragment();
        contactFragment=new ContactFragment();
        friendFragment=new FriendFragment();
        fragmentList.add(chatFragment);
        fragmentList.add(contactFragment);
        fragmentList.add(friendFragment);

        WeixinAdapter weixinAdapter=new WeixinAdapter(getSupportFragmentManager(),fragmentList);
        viewPager.setAdapter(weixinAdapter);
        }
      }

Fragment生命周期

这里写图片描述

onAttach():

执行该方法时,Fragment与Activity已经完成绑定

onCreate():

初始化Fragment。可通过参数savedInstanceState获取之前保存的值。

onCreateView():

初始化Fragment的布局。

onStart():

执行该方法时,Fragment由不可见变为可见状态。

onResume():

执行该方法时,Fragment处于活动状态,用户可与之交互。

onPause():

执行该方法时,Fragment处于暂停状态,但依然可见,用户不能与之交互。

onSaveInstanceState():

保存当前Fragment的状态。该方法会自动保存Fragment的状态

onStop():

执行该方法时,Fragment完全不可见。

onDestroyView():

销毁与Fragment有关的视图,但未与Activity解除绑定,依然可以通过onCreateView方法重新创建视图。

onDestroy():

销毁Fragment。通常按Back键退出或者Fragment被回收时调用此方法。

onDetach():

解除与Activity的绑定。在onDestroy方法之后调用。

public class FirstFragment extends Fragment {
    private static final String TAG = "FirstFragment";
    public FirstFragment() {
        // Required empty public constructor
    }

    @Override
    public void onAttach(Context context) {
        Log.d(TAG, "onAttach: ");
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        Log.d(TAG, "onCreate: ");
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_first, container, false);
    }


    @Override
    public void onStart() {
        Log.d(TAG, "onStart: ");
    }

    @Override
    public void onResume() {
        Log.d(TAG, "onResume: ");
    }

    @Override
    public void onPause() {
        Log.d(TAG, "onPause: ");
    }

    @Override
    public void onStop() {
        Log.d(TAG, "onStop: ");
    }

    @Override
    public void onDestroyView() {
        Log.d(TAG, "onDestroyView: ");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    @Override
    public void onDetach() {
        Log.d(TAG, "onDetach: ");
    }
}

记生命周期的小妙招

onAttach—>onDetach
onCreate—>onDestroy
onCreateView—>onDestroyView
onStart—>onStop
onResume—>onPause
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值