【问题标题】:Android: Hiding fragment which added statically in xmlAndroid:隐藏在xml中静态添加的片段
【发布时间】:2015-08-11 01:40:12
【问题描述】:

我的主 xml 文件中有以下片段:

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main_activity_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/prayer_times_background"
    tools:context="com.yceo.namazvakti.MainActivity">

    <FrameLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/main_menu"
        android:layout_alignParentEnd="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true">
    </FrameLayout>

    <ImageView
        android:id="@+id/settingButton"
        android:layout_width="@dimen/top_right_Button_height_width_size"
        android:layout_height="@dimen/top_right_Button_height_width_size"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:padding="@dimen/top_right_button_pedding"
        android:layout_marginTop="@dimen/top_right_Button_margin_top"
        android:layout_marginRight="10dp"
        android:layout_marginEnd="10dp"
        android:src="@drawable/ic_menu_settings"
        android:scaleType="fitCenter"/>

    <fragment
        android:id="@+id/main_menu"
        android:name="com.yceo.namazvakti.fragments.MenuFragment"
        android:layout_width="match_parent"
        android:layout_height="@dimen/menu_layout_height"
        android:layout_alignParentBottom="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentStart="true"
        tools:layout="@layout/fragment_menu">

    </fragment>

</RelativeLayout>

我想隐藏@+id/main_menu,但我做不到。我尝试了以下选项,但没有奏效:

  • 使用FragmentManager 获取片段本身并使用FragmentManager 隐藏它

    FragmentManager fragmentManager = getSupportFragmentManager();
    MenuFragment menuFragment = (MenuFragment)fragmentManager.findFragmentById(R.id.main_menu);
    fragmentManager.beginTransaction().hide(menuFragment).commit();
    
  • 获取片段View 并设置它的可见性哟GONE

    View activityRootView = findViewById(R.id.main_activity_layout);
    View fragmentMenu = activityRootView.findViewById(R.id.main_menu);
    fragmentMenu.setVisibility(View.GONE);
    

谁能帮帮我?

更新:

更明确地说。我的 MainActivity 中有以下方法

public void setMenuVisibility(int visibility){

    Log.d(LOG_TAG, "MainActivity - setMenuVisibility");

    switch (visibility) {

        case View.VISIBLE:
            Log.d(LOG_TAG, "MainActivity - setMenuVisibility - Showing menuFragment...");
            break;

        case View.GONE:
            Log.d(LOG_TAG, "MainActivity - setMenuVisibility - Hiding menuFragment...");
            break;
    }

    fragmentMenu.setVisibility(View.GONE);

    if (menuFragment != null) {
        View v = menuFragment.getView();

        if (v != null)
            v.setVisibility(visibility);
    }

    fragmentManager.beginTransaction().hide(menuFragment).commit();
}

我从片段中调用这个方法:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    mainActivity = (MainActivity)getActivity();
    mainActivity.setSettingsButtonVisibility(View.GONE); <-- This works
    mainActivity.setMenuVisibility(View.GONE); // <--- But this is not

    View rootView = inflater.inflate(R.layout.fragment_quran_page, container, false);

    backImageView = (ImageView)rootView.findViewById(R.id.back);
    backImageView.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            FragmentManager fm = getActivity().getSupportFragmentManager();
            fm.popBackStack();
        }
    });

    return rootView;
}

【问题讨论】:

    标签: android fragment visibility


    【解决方案1】:

    这里已经解决了:查看以下链接,希望对您有所帮助:

    Show/Hide Fragments and change the visibility attribute programmatically

    还有这个 Show hide fragment in android

    【讨论】:

      【解决方案2】:

      hide 仅在片段以编程方式通过事务添加到容器时才有效。它不影响在 xml 中声明的Fragments

      【讨论】:

      • 我想我必须将片段布局的高度设置为 0dp 才能得到我需要的东西。
      • 不要那样做。为 MenuFragment 有一个额外的容器,并将其添加到宿主活动的 onCreate 中的容器中
      • 你知道不使用 LayoutParams 的理由吗?我刚刚尝试过,它正在按我的意愿工作。
      • 感谢您的建议,但现在动态添加我的菜单工作量太大。现在使用 LayoutParams 是非常可行的 :)
      【解决方案3】:

      当我想隐藏它并恢复它的值以再次显示它时,我已将片段布局高度设置为 0。

          public void setMenuVisibility(int visibility){
      
              Log.d(LOG_TAG, "MainActivity - setMenuVisibility");
              ViewGroup.LayoutParams lp;
      
              switch (visibility) {
      
                  case View.VISIBLE:
                      Log.d(LOG_TAG, "MainActivity - setMenuVisibility - Showing menuFragment...");
                      lp = fragmentMenu.getLayoutParams();
                      lp.height = oldLp.height;
                      fragmentMenu.setLayoutParams(lp);
                      break;
      
                  case View.GONE:
                      Log.d(LOG_TAG, "MainActivity - setMenuVisibility - Hiding menuFragment...");
                      lp = fragmentMenu.getLayoutParams();
                      oldLp = new ViewGroup.LayoutParams(lp.width, lp.height);
                      lp.height = 0;
                      fragmentMenu.setLayoutParams(lp);
                      break;
              }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多