LinearLayout中动态添加Fragment不能填充整个Activity的问题

本人在学习Android开发中,关于Fragment这一块一直头疼不已,在使用LinearLayout做容器动态添加Fragment的时候常常无法根据已经设定的属性布局,例如:
XML布局文件:
1.activity_main.xml


2.first_fragment.xml


3.second_fragment.xml




JAVA文件:
1.MainActivity.java

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); FragmentManager manager = getSupportFragmentManager(); FirstFragment firstFragment = new FirstFragment(); SecondFragment secondFragment = new SecondFragment(); manager.beginTransaction().add(R.id.linearLayout, firstFragment).commit(); manager.beginTransaction().add(R.id.linearLayout, secondFragment).commit(); }

2.FirstFragment.java

@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.first_fragment, null); }



【LinearLayout中动态添加Fragment不能填充整个Activity的问题】3.SecondFragment.java

@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.second_fragment, null ); }



编译运行后,界面却是这样的:
LinearLayout中动态添加Fragment不能填充整个Activity的问题
文章图片




本来在两个Fragment的layout中已经设置了权重,但是却在Activity中没有任何效果。后来经过查找资料,发现是FirstFragment.java和SecondFragment.java中onCreateView方法的问题,在android官方查阅文档如下:
-----------

public View inflate (int resource, ViewGroup root, boolean attachToRoot) Added inAPI level 1 Inflate a new view hierarchy from the specified xml resource. Throws InflateException if there is an error.
Parameters
resource ID for an XML layout resource to load (e.g., R.layout.main_page)
root Optional view to be the parent of the generated hierarchy (if attachToRoot is true), or else simply an object that provides a set of LayoutParams values for root of the returned hierarchy (if attachToRoot is false.)
attachToRoot Whether the inflated hierarchy should be attached to the root parameter? If false, root is only used to create the correct subclass of LayoutParams for the root view in the XML.
Returns
  • The root View of the inflated hierarchy. If root was supplied and attachToRoot is true, this is root; otherwise it is the root of the inflated XML file.
---------------
当attachToRoot传入false值时,ViewGroup root用来保存布局参数,因此若像之前那样传入null,在xml文件中设置的布局参数都会丢失,android会采用默认的布局参数。
如果不相信的话,请运行sdk目录下tools/hierarchyviewer.bat,编译运行你的程序,在Hierarchy Viewer中找到该程序的包,双击。找到两个Fragment布局中的任意一个,比如id为first_layout的那个,点击查看其布局参数值:
LinearLayout中动态添加Fragment不能填充整个Activity的问题
文章图片


LinearLayout中动态添加Fragment不能填充整个Activity的问题
文章图片


请注意画红圈的部分,我们设置的match_parent,,layout_weight全部都失效,而是android自动采用了WRAP_CONTENT,说明我们配置的布局参数并没有被保存使用


现在,根据以上分析,重新配置两个Fragment.java文件,使用container和false值来保存布局参数,例如:

@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.first_fragment, container, false); }

再次编译运行:
LinearLayout中动态添加Fragment不能填充整个Activity的问题
文章图片




问题得到解决,Fragment按照我们配置的布局参数填充了Activity。
PS:
本人只是android开发的初级学习者,遇到这个问题时在网上找不到任何解决办法,所以把自己解决的方式发出来,如果哪里有错误、不足的地方欢迎各位高手指出,帮助我提高,谢谢。

    推荐阅读