如何实现仅点击按钮时才显示Android Fragment?
解决Fragment启动时自动显示的问题
你猜的没错!问题确实出在XML里的<fragment>标签上——这是静态加载Fragment的方式,系统在启动Activity的时候就会自动实例化并显示这个Fragment,完全不受按钮控制。要实现点击按钮才显示的效果,我们需要改成动态加载Fragment的方式,具体步骤如下:
1. 修改布局文件,替换静态Fragment为容器
把activity_main.xml里的<fragment>标签换成<FrameLayout>,作为动态加载Fragment的容器。这样Activity启动时,这个容器是空的,不会显示任何内容:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:orientation="vertical" android:layout_height="fill_parent" tools:context=".MainActivity"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal|center_vertical" android:text="PRESS THIS" android:id = "@+id/test_button" android:background="@drawable/test_button" android:onClick="say_hello" /> <!-- 替换成FrameLayout作为Fragment容器 --> <FrameLayout android:id="@+id/fragment_container" android:layout_width="match_parent" android:layout_height="643dp" /> </LinearLayout>
2. 调整Activity代码,实现动态加载
原来的say_hello方法逻辑没问题,我们可以优化一下,避免重复点击按钮时重复创建Fragment实例:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void say_hello(View view){ // 先检查容器里是否已经有Fragment,避免重复添加 Fragment existingFragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container); if (existingFragment == null) { Fragment fragment = new ExampleFragment(); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.replace(R.id.fragment_container, fragment).commit(); } } }
3. 其他代码保持不变
ExampleFragment和图片布局的代码不需要修改,它们的逻辑是正常的:
public class ExampleFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment return inflater.inflate(R.layout.news_articles, container, false); } }
<ImageView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:src="@drawable/cool_dog"> </ImageView>
为什么这样改?
<FrameLayout>是一个空白容器,不会自动加载任何Fragment,完全由我们通过代码控制加载时机。- 静态
<fragment>标签会在Activity初始化时自动实例化指定的Fragment,这就是它一启动就显示的原因,而动态加载则完全由点击事件触发。
内容的提问来源于stack exchange,提问作者Agent smith 2.0
相关产品推荐
相关产品推荐

