Android Studio含Fragment Container View的布局无法在MainActivity加载
问题描述
我通过Fragment内的按钮,借助接口通信让MainActivity加载另一个布局。当布局仅包含TextView时可正常工作,但替换为Fragment Container View时会崩溃。采用方案将context改为this后,崩溃问题解决,但布局仍无法加载。
代码片段
MainActivity.java
public class MainActivity extends AppCompatActivity implements FragmentB.FragmentBListener { ViewGroup main_layout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); main_layout = findViewById(R.id.main_layout); } // fullScreen方法由FragmentB的按钮点击触发 @Override public void fullScreen() { LayoutInflater inflater = LayoutInflater.from(MainActivity.this); View view = inflater.inflate(R.layout.fullscreen, main_layout,false); main_layout.removeAllViews(); main_layout.addView(view); } }
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="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:id="@+id/main_layout" tools:context=".MainActivity"> // 初始布局代码 </RelativeLayout>
fullscreen.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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" tools:context=".MainActivity"> <androidx.fragment.app.FragmentContainerView android:id="@+id/fragmentContainerViewB" android:name="com.example.testglide.FragmentB" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="500dp" tools:layout="@layout/fragment_b" /> </RelativeLayout>
问题原因
- 仅通过
LayoutInflater.inflate()加载包含FragmentContainerView的布局,只会将View添加到容器中,但不会自动实例化和附加对应的Fragment——Fragment的管理必须通过FragmentManager完成,直接加载View的方式无法触发Fragment的生命周期。 - 另外,
fullscreen.xml中FragmentContainerView设置了android:layout_marginTop="500dp",这个值过大可能导致Fragment被推到屏幕可视区域外,看起来像是布局未加载。
解决方案
方案一:直接通过FragmentManager管理Fragment(推荐)
放弃手动加载布局,直接通过Fragment事务将FragmentB添加到主容器中,更符合Android组件化规范:
@Override public void fullScreen() { main_layout.removeAllViews(); // 创建FragmentContainerView作为Fragment的容器 FragmentContainerView container = new FragmentContainerView(this); container.setId(R.id.fragmentContainerViewB); main_layout.addView(container); // 通过FragmentManager添加FragmentB getSupportFragmentManager().beginTransaction() .replace(R.id.fragmentContainerViewB, FragmentB.class, null) .commitNow(); }
方案二:手动初始化布局中的Fragment
如果坚持使用fullscreen.xml布局,需要手动通过FragmentManager初始化Fragment:
@Override public void fullScreen() { LayoutInflater inflater = LayoutInflater.from(this); View view = inflater.inflate(R.layout.fullscreen, main_layout, false); main_layout.removeAllViews(); main_layout.addView(view); // 检查Fragment是否已存在,不存在则手动添加 FragmentB fragmentB = (FragmentB) getSupportFragmentManager().findFragmentById(R.id.fragmentContainerViewB); if (fragmentB == null) { getSupportFragmentManager().beginTransaction() .add(R.id.fragmentContainerViewB, FragmentB.class, null) .commitNow(); } }
额外注意事项
将fullscreen.xml中FragmentContainerView的android:layout_marginTop="500dp"修改为合理值(比如20dp),避免Fragment超出屏幕可视范围。
内容的提问来源于stack exchange,提问作者Samy Sylvester
相关产品推荐
相关产品推荐

