版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nongminkouhao/article/details/81712669
viewpager懒加载
什么是懒加载:viewpager会默认预加载当前界面左右的fragment,为了防止其他需要预加载并且不可见的fragment与当前可见的fragment在加载数据时抢占cpu和内存资源,预加载的fragment只有当其可见时才去加载数据,这样有利于提高用户体验
效果图如下:每个界面只有在可见时才会随机一个整数且只随机一次
涉及到以下几点知识点:
- 通过setOffscreenPageLimit方法设置offscreenPageLimit个数来控制缓存可见界面左右两边各缓存的page数目 ,总数目为n*2+1;当加载的page超过这个数目时会用FragmentManager来释放fragment;offscreenPageLimit默认值为1
- FragmentPagerAdapter当缓存的界面超过n*2+1时候,会对界面进行回收,只会回收view,不回收Fragment,见图 执行了Fragment的onDestoryView方法,并没有执行onDestory方法,下次使用时候会重新初始化view;适合fragment数目较少的情况,因为其fragment并没有被回收,一直占用着内存
- setUserVisibleHint(boolean isVisibleToUser)的参数isVisibleToUser为true时候表示当前fragment对用户可见,为false时表示对用户不可见
- FragmentStatePagerAdapter当缓存的界面超过n*2+1时候,会对界面进行回收,会把整个Fragment进行回收,见图 执行了Fragment的onDestory方法,下次使用时会重新创建一个fragment;适合fragment数目比较多
Adapter为FragmentPagerAdapter时,日志如下:
FragmentPagerAdapter
--------------------------------------app启动打开第0个fragment-------------------------------------------------
09-20 22:06:00.468 5366-5366/com.hj.test D/生命周期_Fragment0: setUserVisibleHintfalse
09-20 22:06:00.468 5366-5366/com.hj.test D/生命周期_Fragment1: setUserVisibleHintfalse
09-20 22:06:00.468 5366-5366/com.hj.test D/生命周期_Fragment0: setUserVisibleHinttrue
09-20 22:06:00.469 5366-5366/com.hj.test D/生命周期_Fragment0: onAttach
09-20 22:06:00.469 5366-5366/com.hj.test D/生命周期_Fragment1: onAttach
09-20 22:06:00.469 5366-5366/com.hj.test D/生命周期_Fragment0: onCreateView
09-20 22:06:00.472 5366-5366/com.hj.test D/生命周期_Fragment0: lazyLoad第0个界面准备加载数据
09-20 22:06:00.472 5366-5366/com.hj.test D/生命周期_Fragment0: onActivityCreated
09-20 22:06:00.472 5366-5366/com.hj.test D/生命周期_Fragment0: onViewStateRestored
09-20 22:06:00.472 5366-5366/com.hj.test D/生命周期_Fragment0: onStart
09-20 22:06:00.472 5366-5366/com.hj.test D/生命周期_Fragment0: onResume
09-20 22:06:00.473 5366-5366/com.hj.test D/生命周期_Fragment1: onCreateView
09-20 22:06:00.475 5366-5366/com.hj.test D/生命周期_Fragment1: onActivityCreated
09-20 22:06:00.475 5366-5366/com.hj.test D/生命周期_Fragment1: onViewStateRestored
09-20 22:06:00.475 5366-5366/com.hj.test D/生命周期_Fragment1: onStart
09-20 22:06:00.475 5366-5366/com.hj.test D/生命周期_Fragment1: onResume
--------------------------------------由第0个fragment滑动到第1个fragment---------------------------------------------------
09-20 22:06:07.455 5366-5366/com.hj.test D/生命周期_Fragment2: setUserVisibleHintfalse
09-20 22:06:07.455 5366-5366/com.hj.test D/生命周期_Fragment0: setUserVisibleHintfalse
09-20 22:06:07.455 5366-5366/com.hj.test D/生命周期_Fragment1: lazyLoad第1个界面准备加载数据
09-20 22:06:07.458 5366-5366/com.hj.test D/生命周期_Fragment1: setUserVisibleHinttrue
09-20 22:06:07.459 5366-5366/com.hj.test D/生命周期_Fragment2: onAttach
09-20 22:06:07.460 5366-5366/com.hj.test D/生命周期_Fragment2: onCreateView
09-20 22:06:07.469 5366-5366/com.hj.test D/生命周期_Fragment2: onActivityCreated
09-20 22:06:07.469 5366-5366/com.hj.test D/生命周期_Fragment2: onViewStateRestored
09-20 22:06:07.469 5366-5366/com.hj.test D/生命周期_Fragment2: onStart
09-20 22:06:07.470 5366-5366/com.hj.test D/生命周期_Fragment2: onResume
--------------------------------------由第1个fragment滑动到第2个fragment---------------------------------------------------
09-20 22:06:21.633 5366-5366/com.hj.test D/生命周期_Fragment3: setUserVisibleHintfalse
09-20 22:06:21.634 5366-5366/com.hj.test D/生命周期_Fragment1: setUserVisibleHintfalse
09-20 22:06:21.634 5366-5366/com.hj.test D/生命周期_Fragment2: lazyLoad第2个界面准备加载数据
09-20 22:06:21.637 5366-5366/com.hj.test D/生命周期_Fragment2: setUserVisibleHinttrue
09-20 22:06:21.638 5366-5366/com.hj.test D/生命周期_Fragment3: onAttach
09-20 22:06:21.639 5366-5366/com.hj.test D/生命周期_Fragment0: onPause
09-20 22:06:21.639 5366-5366/com.hj.test D/生命周期_Fragment0: onStop
09-20 22:06:21.640 5366-5366/com.hj.test D/生命周期_Fragment0: onDestroyView
09-20 22:06:21.642 5366-5366/com.hj.test D/生命周期_Fragment3: onCreateView
09-20 22:06:21.653 5366-5366/com.hj.test D/生命周期_Fragment3: onActivityCreated
09-20 22:06:21.654 5366-5366/com.hj.test D/生命周期_Fragment3: onViewStateRestored
09-20 22:06:21.654 5366-5366/com.hj.test D/生命周期_Fragment3: onStart
09-20 22:06:21.654 5366-5366/com.hj.test D/生命周期_Fragment3: onResume
--------------------------------------由第2个fragment滑动到第1个fragment---------------------------------------------------
09-20 22:06:29.427 5366-5366/com.hj.test D/生命周期_Fragment0: setUserVisibleHintfalse
09-20 22:06:29.428 5366-5366/com.hj.test D/生命周期_Fragment2: setUserVisibleHintfalse
09-20 22:06:29.428 5366-5366/com.hj.test D/生命周期_Fragment1: setUserVisibleHinttrue
09-20 22:06:29.430 5366-5366/com.hj.test D/生命周期_Fragment0: onCreateView
09-20 22:06:29.440 5366-5366/com.hj.test D/生命周期_Fragment0: lazyLoad第0个界面准备加载数据
09-20 22:06:29.440 5366-5366/com.hj.test D/生命周期_Fragment0: onActivityCreated
09-20 22:06:29.441 5366-5366/com.hj.test D/生命周期_Fragment0: onViewStateRestored
09-20 22:06:29.442 5366-5366/com.hj.test D/生命周期_Fragment3: onPause
09-20 22:06:29.442 5366-5366/com.hj.test D/生命周期_Fragment3: onStop
09-20 22:06:29.442 5366-5366/com.hj.test D/生命周期_Fragment3: onDestroyView
09-20 22:06:29.443 5366-5366/com.hj.test D/生命周期_Fragment0: onStart
09-20 22:06:29.443 5366-5366/com.hj.test D/生命周期_Fragment0: onResume
--------------------------------------由第1个fragment滑动到第0个fragment---------------------------------------------------
09-20 22:06:37.288 5366-5366/com.hj.test D/生命周期_Fragment1: setUserVisibleHintfalse
09-20 22:06:37.288 5366-5366/com.hj.test D/生命周期_Fragment0: setUserVisibleHinttrue
09-20 22:06:37.291 5366-5366/com.hj.test D/生命周期_Fragment2: onPause
09-20 22:06:37.291 5366-5366/com.hj.test D/生命周期_Fragment2: onStop
09-20 22:06:37.291 5366-5366/com.hj.test D/生命周期_Fragment2: onDestroyView
Adapter为FragmentStatePagerAdapter时,日志如下:
FragmentStatePagerAdapter
--------------------------------------app启动打开第0个fragment-------------------------------------------------
09-20 21:44:18.281 8635-8635/com.hj.test D/生命周期_Fragment0: setUserVisibleHintfalse
09-20 21:44:18.281 8635-8635/com.hj.test D/生命周期_Fragment1: setUserVisibleHintfalse
09-20 21:44:18.281 8635-8635/com.hj.test D/生命周期_Fragment0: setUserVisibleHinttrue
09-20 21:44:18.281 8635-8635/com.hj.test D/生命周期_Fragment0: onAttach
09-20 21:44:18.281 8635-8635/com.hj.test D/生命周期_Fragment1: onAttach
09-20 21:44:18.282 8635-8635/com.hj.test D/生命周期_Fragment0: onCreateView
09-20 21:44:18.285 8635-8635/com.hj.test D/生命周期_Fragment0: lazyLoad第0个界面准备加载数据
09-20 21:44:18.286 8635-8635/com.hj.test D/生命周期_Fragment0: onActivityCreated
09-20 21:44:18.286 8635-8635/com.hj.test D/生命周期_Fragment0: onViewStateRestored
09-20 21:44:18.286 8635-8635/com.hj.test D/生命周期_Fragment0: onStart
09-20 21:44:18.286 8635-8635/com.hj.test D/生命周期_Fragment0: onResume
09-20 21:44:18.286 8635-8635/com.hj.test D/生命周期_Fragment1: onCreateView
09-20 21:44:18.289 8635-8635/com.hj.test D/生命周期_Fragment1: onActivityCreated
09-20 21:44:18.289 8635-8635/com.hj.test D/生命周期_Fragment1: onViewStateRestored
09-20 21:44:18.289 8635-8635/com.hj.test D/生命周期_Fragment1: onStart
09-20 21:44:18.289 8635-8635/com.hj.test D/生命周期_Fragment1: onResume
--------------------------------------由第0个fragment滑动到第1个fragment---------------------------------------------------
09-20 21:45:11.405 8635-8635/com.hj.test D/生命周期_Fragment2: setUserVisibleHintfalse
09-20 21:45:11.406 8635-8635/com.hj.test D/生命周期_Fragment0: setUserVisibleHintfalse
09-20 21:45:11.406 8635-8635/com.hj.test D/生命周期_Fragment1: lazyLoad第1个界面准备加载数据
09-20 21:45:11.409 8635-8635/com.hj.test D/生命周期_Fragment1: setUserVisibleHinttrue
09-20 21:45:11.411 8635-8635/com.hj.test D/生命周期_Fragment2: onAttach
09-20 21:45:11.413 8635-8635/com.hj.test D/生命周期_Fragment2: onCreateView
09-20 21:45:11.427 8635-8635/com.hj.test D/生命周期_Fragment2: onActivityCreated
09-20 21:45:11.428 8635-8635/com.hj.test D/生命周期_Fragment2: onViewStateRestored
09-20 21:45:11.428 8635-8635/com.hj.test D/生命周期_Fragment2: onStart
09-20 21:45:11.428 8635-8635/com.hj.test D/生命周期_Fragment2: onResume
--------------------------------------由第1个fragment滑动到第2个fragment---------------------------------------------------
09-20 21:45:50.422 8635-8635/com.hj.test D/生命周期_Fragment0: onSaveInstanceState
09-20 21:45:50.426 8635-8635/com.hj.test D/生命周期_Fragment3: setUserVisibleHintfalse
09-20 21:45:50.427 8635-8635/com.hj.test D/生命周期_Fragment1: setUserVisibleHintfalse
09-20 21:45:50.427 8635-8635/com.hj.test D/生命周期_Fragment2: lazyLoad第2个界面准备加载数据
09-20 21:45:50.431 8635-8635/com.hj.test D/生命周期_Fragment2: setUserVisibleHinttrue
09-20 21:45:50.432 8635-8635/com.hj.test D/生命周期_Fragment3: onAttach
09-20 21:45:50.433 8635-8635/com.hj.test D/生命周期_Fragment0: onPause
09-20 21:45:50.434 8635-8635/com.hj.test D/生命周期_Fragment0: onStop
09-20 21:45:50.434 8635-8635/com.hj.test D/生命周期_Fragment0: onDestroyView
09-20 21:45:50.436 8635-8635/com.hj.test D/生命周期_Fragment0: onDestroy
09-20 21:45:50.436 8635-8635/com.hj.test D/生命周期_Fragment0: onDetach
09-20 21:45:50.438 8635-8635/com.hj.test D/生命周期_Fragment3: onCreateView
09-20 21:45:50.450 8635-8635/com.hj.test D/生命周期_Fragment3: onActivityCreated
09-20 21:45:50.451 8635-8635/com.hj.test D/生命周期_Fragment3: onViewStateRestored
09-20 21:45:50.451 8635-8635/com.hj.test D/生命周期_Fragment3: onStart
09-20 21:45:50.451 8635-8635/com.hj.test D/生命周期_Fragment3: onResume
--------------------------------------由第2个fragment滑动到第1个fragment---------------------------------------------------
09-20 21:59:12.714 27188-27188/com.hj.test D/生命周期_Fragment0: setUserVisibleHintfalse
09-20 21:59:12.715 27188-27188/com.hj.test D/生命周期_Fragment3: onSaveInstanceState
09-20 21:59:12.717 27188-27188/com.hj.test D/生命周期_Fragment2: setUserVisibleHintfalse
09-20 21:59:12.718 27188-27188/com.hj.test D/生命周期_Fragment1: setUserVisibleHinttrue
09-20 21:59:12.719 27188-27188/com.hj.test D/生命周期_Fragment0: onAttach
09-20 21:59:12.720 27188-27188/com.hj.test D/生命周期_Fragment3: onPause
09-20 21:59:12.720 27188-27188/com.hj.test D/生命周期_Fragment3: onStop
09-20 21:59:12.720 27188-27188/com.hj.test D/生命周期_Fragment3: onDestroyView
09-20 21:59:12.722 27188-27188/com.hj.test D/生命周期_Fragment3: onDestroy
09-20 21:59:12.723 27188-27188/com.hj.test D/生命周期_Fragment3: onDetach
09-20 21:59:12.723 27188-27188/com.hj.test D/生命周期_Fragment0: onCreateView
09-20 21:59:12.737 27188-27188/com.hj.test D/生命周期_Fragment0: lazyLoad第0个界面准备加载数据
09-20 21:59:12.737 27188-27188/com.hj.test D/生命周期_Fragment0: onActivityCreated
09-20 21:59:12.739 27188-27188/com.hj.test D/生命周期_Fragment0: onViewStateRestored
09-20 21:59:12.739 27188-27188/com.hj.test D/生命周期_Fragment0: onStart
09-20 21:59:12.739 27188-27188/com.hj.test D/生命周期_Fragment0: onResume
--------------------------------------由第1个fragment滑动到第0个fragment---------------------------------------------------
09-20 22:00:30.527 27188-27188/com.hj.test D/生命周期_Fragment2: onSaveInstanceState
09-20 22:00:30.528 27188-27188/com.hj.test D/生命周期_Fragment1: setUserVisibleHintfalse
09-20 22:00:30.528 27188-27188/com.hj.test D/生命周期_Fragment0: setUserVisibleHinttrue
09-20 22:00:30.530 27188-27188/com.hj.test D/生命周期_Fragment2: onPause
09-20 22:00:30.531 27188-27188/com.hj.test D/生命周期_Fragment2: onStop
09-20 22:00:30.531 27188-27188/com.hj.test D/生命周期_Fragment2: onDestroyView
09-20 22:00:30.533 27188-27188/com.hj.test D/生命周期_Fragment2: onDestroy
09-20 22:00:30.533 27188-27188/com.hj.test D/生命周期_Fragment2: onDetach
offscreenPageLimit为默认值1,默认加载当前界面左右各一个;左边没有,所以进入界面会加载第0个位置和预加载第1个位置的fragment;首先界面显示前,两个fragment的setUserVisibleHint都为false,不可见,然后对第0、1个位置进行初始化操作;当第0个位置的fragment的onAttach、onCreate执行后,会发现setUserVisibleHint为true了,我们会在这时候做一些数据加载的操作
LazyFragment代码如下:
package com.hj.test;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import android.view.View;
public abstract class LazyFragment extends Fragment {
protected FragmentActivity mActivity;
protected boolean isVisibleToUser;//当前界面是否可见
protected boolean isViewInitialized;//view是否初始化完成
protected boolean isDataInitialized;//数据是否加载过
protected Bundle bundle;
public abstract void setUpView(View view);
public abstract void setUpData();
@Override
public void onAttach(Context context) {
super.onAttach(context);
bundle = getArguments();
Log.d("生命周期_Fragment"+bundle.get("id"),"onAttach");
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mActivity = getActivity();
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
setUpView(view);
isViewInitialized = true;
if (savedInstanceState != null){
onRestoreInstanceState(savedInstanceState);
}
if (isDataInitialized){
setUpData();
}else {
checkIsLoadData();//因为刚进来有setUserVisibleHint先执行,当前可见,但是view还没有初始化的情况,所以在view初始化完毕还需要重新判断是否需要懒加载数据
}
}
protected void onRestoreInstanceState(Bundle savedInstanceState) {
isDataInitialized = true;
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
this.isVisibleToUser = isVisibleToUser;
checkIsLoadData();
Log.d("生命周期_Fragment"+getArguments().get("id"),"setUserVisibleHint"+isVisibleToUser);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log.d("生命周期_Fragment"+bundle.get("id"),"onActivityCreated");
}
@Override
public void onStart() {
super.onStart();
Log.d("生命周期_Fragment"+bundle.get("id"),"onStart");
}
@Override
public void onResume() {
super.onResume();
Log.d("生命周期_Fragment"+bundle.get("id"),"onResume");
}
@Override
public void onPause() {
super.onPause();
Log.d("生命周期_Fragment"+bundle.get("id"),"onPause");
}
@Override
public void onStop() {
super.onStop();
Log.d("生命周期_Fragment"+bundle.get("id"),"onStop");
}
@Override
public void onDestroyView() {
super.onDestroyView();
isViewInitialized = false;
Log.d("生命周期_Fragment"+bundle.get("id"),"onDestroyView");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d("生命周期_Fragment"+bundle.get("id"),"onDestroy");
}
@Override
public void onDetach() {
super.onDetach();
Log.d("生命周期_Fragment"+bundle.get("id"),"onDetach");
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.d("生命周期_Fragment"+bundle.get("id"),"onSaveInstanceState");
}
@Override
public void onViewStateRestored(@Nullable Bundle savedInstanceState) {
super.onViewStateRestored(savedInstanceState);
Log.d("生命周期_Fragment"+bundle.get("id"),"onViewStateRestored");
}
/**
* 检查是否需要加载数据
*/
private void checkIsLoadData(){
if(isVisibleToUser && isViewInitialized && !isDataInitialized){//当前可见&&view已经初始化&&数据没有初始化
isDataInitialized = true;
setUpData();
}
}
}
SimpleFragment代码如下:
package com.hj.test;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.Random;
public class SimpleFragment extends LazyFragment {
private TextView tv;
private String data;
@Override
public void setUpView(View view) {
tv = (TextView) view.findViewById(R.id.tv);
}
@Override
public void setUpData() {
Log.d("生命周期_Fragment"+bundle.get("id"),"lazyLoad第"+bundle.get("id")+"个界面准备加载数据");
if(TextUtils.isEmpty(data)){
data = new Random().nextInt(10)+"";
}
tv.setText(data);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Log.d("生命周期_Fragment"+bundle.get("id"),"onCreateView");
return inflater.inflate(R.layout.fragment_layout, null);
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if(!TextUtils.isEmpty(tv.getText())){
outState.putString("data",tv.getText().toString());
}
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
if (savedInstanceState != null) {
data = savedInstanceState.getString("data");
}
}
}
MainActivity代码如下:
package com.hj.test;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import com.flyco.tablayout.SlidingTabLayout;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private final String[] mTitles = {"第0个", "第1个", "第2个", "第3个", "第4个"};
private ViewPager viewpager;
private MyAdapter adapter;
private SlidingTabLayout slidingtablayout;
private List<Fragment> fragments = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewpager = (ViewPager) findViewById(R.id.exam_viewpager);
addFragments();
adapter = new MyAdapter(getSupportFragmentManager(), fragments);
viewpager.setAdapter(adapter);
slidingtablayout = (SlidingTabLayout) findViewById(R.id.examtablayout);
slidingtablayout.setViewPager(viewpager);
}
private void addFragments() {
for (int i=0;i<5;i++){
fragments.add(new SimpleFragment());
}
}
class MyAdapter extends FragmentPagerAdapter {
private List<Fragment> fragmentList;
public MyAdapter(FragmentManager fm, List<Fragment> fragmentList) {
super(fm);
this.fragmentList = fragmentList;
}
@Override
public Fragment getItem(int position) {
Fragment fragment = fragmentList.get(position);
Bundle bundle = new Bundle();
bundle.putInt("id",position);
fragment.setArguments(bundle);
return fragmentList.get(position);
}
@Override
public int getCount() {
return fragmentList.size();
}
@Override
public CharSequence getPageTitle(int position) {
return mTitles[position];
}
}
}
activity_main.xml代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tl="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.hj.test.MainActivity">
<com.flyco.tablayout.SlidingTabLayout
android:id="@+id/examtablayout"
android:layout_width="match_parent"
android:layout_height="50dp"
tl:tl_divider_width="0dp"
tl:tl_indicator_color="@android:color/holo_blue_light"
tl:tl_indicator_height="2dp"
tl:tl_tab_padding="20dp"
tl:tl_tab_space_equal="true"
tl:tl_textSelectColor="@android:color/background_dark"
tl:tl_textUnselectColor="@android:color/holo_red_light"
tl:tl_underline_color="@android:color/holo_blue_dark"
tl:tl_underline_height="1dp"
>
</com.flyco.tablayout.SlidingTabLayout>
<android.support.v4.view.ViewPager
android:id="@+id/exam_viewpager"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/examtablayout"/>
</LinearLayout>
fragment_layout.xml代码如下:
<?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:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.hj.test.MainActivity">
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="fragment"/>
</LinearLayout>
有问题请留言指出,谢谢