Fragment碎片的使用

Fragment碎片的使用类似于Activity,不过碎片的生命周期比Activity要丰富一些

关于Fragment有两种使用方法

第一种使用方法,静态注册

首先需要有一个布局文件,这里以线性布局为例,假设里面放置了一个ImageView和一个TextView

然后写一个类,继承自Fragment,然后在OnCreateView方法中通过inflater.inflate()获取到布局文件

再逐个给布局文件的控件设置属性,最后返回view 

然后在Activity中对应的xml文件引用<Fragment>标签 注意给name属性设置值为包名

第二种使用方法,动态注册

这里以ViewPager为例

首先写一个类继承自Fragment,写一个静态的返回实例方法(不是单例模式

在这个方法里面获取到外界传来的参数,以便给我们的Fragment所对应的布局文件设置格式。

这里用到了Bundle包裹,先把外界传递的参数给包裹,再通过包裹把参数给到onCreateView方法中,再通过inflate方法获取到布局对象

再通过对象找到具体控件,再给控件设置值,最后返回view。

这里使用了FragmentPagerAdapter适配器(已经过时了,最新的好像用的是ViewPager2,还没学到那里)

getItem方法返回一个Fragment对象(通过静态方法

最后再活动页面给ViewPager对象设置适配器,最后运行即可

第一个类

package com.example.clockapp.Fragment;

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;

public class MyFirstAdapter extends FragmentPagerAdapter {
   private String[]title;
   private String[]include;


    public MyFirstAdapter(@NonNull FragmentManager fm, String[]title,String[]include) {
       super(fm,BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
       this.include = include;
       this.title = title;
    }

    @NonNull
    @Override
    public Fragment getItem(int position) {
        return MyFirstFragment.getInstance(position,title[position],include[position]);
    }

    @Override
    public int getCount() {
        return title.length;
    }
}

第二个类

package com.example.clockapp.Fragment;

import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

import com.example.clockapp.R;

public class MyFirstFragment extends Fragment {
    private View mView;
    private Context mContext;
    private String title;
    private String include;
    public static MyFirstFragment getInstance(int position,String title,String include){
        MyFirstFragment fragment = new MyFirstFragment();
        Bundle bundle = new Bundle();
        bundle.putString("title",title);
        bundle.putString("include",include);
        fragment.setArguments(bundle);
        return fragment;
    }

    @Nullable
    //注意了,这里的onCreateView方法是动态创建一个碎片视图时加载的方法,第二个参数container是指的碎片所在的容器
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        mContext = getActivity();//Fragment的方法
        if(getArguments()!=null){
            title = getArguments().getString("title","nothing");
            include = getArguments().getString("include","nothing");
        }
        mView = inflater.inflate(R.layout.fragment_item,container,false);
        TextView tv_title = mView.findViewById(R.id.tv_title);
        TextView tv_include = mView.findViewById(R.id.tv_include);
        tv_title.setText(title);
        tv_include.setText(include);
        return mView;
    }
}

第三个类

package com.example.clockapp.Fragment;

import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager.widget.ViewPager;

import android.annotation.SuppressLint;
import android.os.Bundle;

import com.example.clockapp.R;

public class ViewPagerByFragmentActivity extends AppCompatActivity {
    private ViewPager vp_fragment;
    @SuppressLint("MissingInflatedId")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view_pager_by_fragment);
        vp_fragment = findViewById(R.id.vp_fragment);
        String[] title = {"1","2","3"};
        String[] include = {"1111","2222","3333"};
        MyFirstAdapter adapter = new MyFirstAdapter(getSupportFragmentManager(),title,include);
        vp_fragment.setAdapter(adapter);
        vp_fragment.setCurrentItem(0);
    }
}

 

 

 

 使用到的布局文件如上所示,代码示例不唯一,只要书写规范符合要求,就拥有无限的创造性。

posted @ 2023-02-25 22:08  -她的梦-  阅读(75)  评论(0编辑  收藏  举报