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); } }
使用到的布局文件如上所示,代码示例不唯一,只要书写规范符合要求,就拥有无限的创造性。