You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实现点击对应按钮时才分别显示其下方的Fragment

实现点击按钮单独显示对应Fragment的解决方案

你已经有了一个很好的初始思路,我来帮你补全代码并优化,完美实现点击对应按钮时仅显示该按钮下方Fragment的功能:

完整的Tnpcell Activity代码

public class Tnpcell extends AppCompatActivity {
    // 声明所有需要用到的按钮
    Button btn1, btn2, btn3;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tnpcell);

        // 初始化按钮实例
        btn1 = findViewById(R.id.btn1);
        btn2 = findViewById(R.id.btn2);
        btn3 = findViewById(R.id.btn3);

        FragmentManager fm = getFragmentManager();
        // 获取布局中对应的Fragment实例
        Fragment fragment1 = fm.findFragmentById(R.id.fragmentplace1);
        Fragment fragment2 = fm.findFragmentById(R.id.fragmentplace2);
        Fragment fragment3 = fm.findFragmentById(R.id.fragmentplace3);

        // 初始状态:先隐藏所有Fragment,避免多个Fragment同时显示
        hideAllFragments(fm, fragment1, fragment2, fragment3);
        // 可选:默认显示第一个Fragment,如果不需要可以删掉这行
        fm.beginTransaction().show(fragment1).commit();

        // 给每个按钮绑定专属的显示/隐藏监听
        addShowHideListener(btn1, fragment1, fm, fragment2, fragment3);
        addShowHideListener(btn2, fragment2, fm, fragment1, fragment3);
        addShowHideListener(btn3, fragment3, fm, fragment1, fragment2);
    }

    /**
     * 封装的监听方法:点击按钮时显示目标Fragment,隐藏其他所有Fragment
     * @param targetBtn 被点击的按钮
     * @param targetFragment 要显示的目标Fragment
     * @param fm FragmentManager实例
     * @param hideFragments 需要隐藏的其他Fragment
     */
    private void addShowHideListener(Button targetBtn, final Fragment targetFragment, 
                                    FragmentManager fm, final Fragment... hideFragments) {
        targetBtn.setOnClickListener(v -> {
            FragmentTransaction transaction = fm.beginTransaction();
            // 显示目标Fragment
            transaction.show(targetFragment);
            // 遍历隐藏其他所有Fragment
            for (Fragment frag : hideFragments) {
                transaction.hide(frag);
            }
            // 提交事务
            transaction.commit();
        });
    }

    /**
     * 辅助方法:一次性隐藏所有传入的Fragment
     */
    private void hideAllFragments(FragmentManager fm, Fragment... fragments) {
        FragmentTransaction transaction = fm.beginTransaction();
        for (Fragment frag : fragments) {
            transaction.hide(frag);
        }
        transaction.commit();
    }
}

布局文件(activity_tnpcell.xml)参考

确保你的布局里每个按钮下方对应一个Fragment容器(或直接嵌入Fragment),示例结构如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">

    <!-- 按钮1 + Fragment1容器 -->
    <Button
        android:id="@+id/btn1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="显示Fragment 1"/>

    <FrameLayout
        android:id="@+id/fragmentplace1"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:layout_marginTop="8dp">
        <!-- 直接嵌入Fragment,或者通过代码动态添加 -->
        <fragment
            android:name="com.yourpackage.Fragment1"
            android:id="@+id/fragment1"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    </FrameLayout>

    <!-- 按钮2 + Fragment2容器 -->
    <Button
        android:id="@+id/btn2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:text="显示Fragment 2"/>

    <FrameLayout
        android:id="@+id/fragmentplace2"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:layout_marginTop="8dp">
        <fragment
            android:name="com.yourpackage.Fragment2"
            android:id="@+id/fragment2"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    </FrameLayout>

    <!-- 按钮3 + Fragment3容器 -->
    <Button
        android:id="@+id/btn3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:text="显示Fragment 3"/>

    <FrameLayout
        android:id="@+id/fragmentplace3"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:layout_marginTop="8dp">
        <fragment
            android:name="com.yourpackage.Fragment3"
            android:id="@+id/fragment3"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    </FrameLayout>

</LinearLayout>

关键细节说明

  • 初始状态控制:代码开头先隐藏所有Fragment,避免多个Fragment同时显示;如果需要默认展示第一个Fragment,保留fm.beginTransaction().show(fragment1).commit()即可。
  • 高效的Fragment切换:使用show()和hide()方法切换Fragment,相比replace()更高效,因为Fragment实例会被保留,不会重复创建和销毁,能保留用户的操作状态(比如输入的内容)。
  • AndroidX适配:如果你的项目使用AndroidX,请将getFragmentManager()替换为getSupportFragmentManager(),同时Fragment要继承androidx.fragment.app.Fragment。
  • 避免重复代码:通过封装addShowHideListener方法,减少重复的点击监听代码,让逻辑更清晰。

内容的提问来源于stack exchange,提问作者rahul_107

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:16:07