如何在android中实现显示和隐藏片段

如何在Android中实现显示和隐藏片段? 我在活动中添加了两个片段。 一个包含菜单和一个片段的片段包含子菜单。 我有很多菜单片段中的button像家,想法等,如果我点击想法button。 我必须显示子菜单。 如果我再次点击想法button,我必须隐藏子菜单。 任何人都可以提供例子,或如何访问另一个片段中的一个视图片段?

这是我的布局主要

?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent" > <fragment class="com.gcm.fragment.CommonFragment" android:id="@+id/the_frag" android:layout_width="wrap_content" android:layout_height="match_parent" /> <fragment class="com.gcm.fragment.SubFragment" android:id="@+id/the_frag1" android:layout_marginTop="130dip" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> 

在我的片段

 package com.gcm.fragment; import android.app.Fragment; import android.app.FragmentManager; import android.app.FragmentTransaction; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.View.OnClickListener; import android.widget.TextView; public class CommonFragment extends Fragment implements OnClickListener { TextView txtIhaveIdea=null; boolean menuVisible=false; public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) { ViewGroup layout = (ViewGroup) inflater.inflate(R.layout.collapsed_menu2, container, false); txtIhaveIdea=(TextView)layout.findViewById(R.id.txtIhaveAnIdea); txtIhaveIdea.setOnClickListener(this); return layout; } @Override public void onClick(View v) { // TODO Auto-generated method stub if(!menuVisible) { FragmentManager fm = getFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); fm.beginTransaction(); Fragment fragOne = new SubFragment(); ft.show(fragOne); } else { FragmentManager fm = getFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); fm.beginTransaction(); Fragment fragOne = new SubFragment(); ft.hide(fragOne); } } } 

谢谢

Solutions Collecting From Web of "如何在android中实现显示和隐藏片段"

考虑到这个问题已经超过了2K ..答案可能仍然有助于新读者,所以在这里:

  • 你并不是真的想要在片段中发生FragmentManager和FragmentTransaction而没有Cast或者对你的Activity有潜在的有害的引用,

所以我做的工作就好了,为Fragment设置一个接口并给出一个方法,比如说needsHide():

 public class MyFrag extends Fragment { public interface MyFragInterface { public void needsHide(); } 

然后在你的Activity上实现它:

 public class MainActivity extends FragmentActivity implements MyFrag.MyFragInterface { public void needsHide() { FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); //find the fragment by View or Tag MyFrag myFrag = (MyFrag)fragmentManager.findFragmentByTag(SOME_TAG); fragmentTransaction.hide(myFrag); fragmentTransaction.commit(); //do more if you must }} 

唯一需要考虑的部分是何时调用needsHide(),你可以在你的Fragment的onViewCreated中做这件事,因为你确定MainActivity提交事务还不算太早。 如果你把它放在创build()它可能无法正常工作取决于你做什么oter碎片:

  @Override public void onViewCreated(View view, Bundle savedInstanceState) { // Making sure Main activity implemented interface try { if (USE_A_CONDITION) { ((MyFragInterface)this.getActivity()).needsHide(); } } catch (ClassCastException e) { throw new ClassCastException("Calling activity must implement MyFragInterface"); } super.onViewCreated(view, savedInstanceState); } 

简单地说,在您的“家长”活动中创build一个公共方法。 隐藏片段。

然后从你的点击事件的片段中获取“父| |” 活动,投它,然后调用你创build的方法。

  ((ParentActitity)getActivity()).hideFragment(); 

你可以尝试获取framelayout或按ID分片,并改变其可见性

 View frag = findViewById(R.id.my_fragment); frag.setVisibility(View.VISIBLE); 

您需要使用接口与您的父级活动进行通信。

看看Vogella的教程,“3.4。与碎片的应用程序通信”。 这是链接

方法hide() :隐藏现有的片段。 这只对视图添加到容器的片段有用,因为这会导致视图被隐藏。

你的代码:

 @Override public void onClick(View v) { if(!menuVisible) { FragmentManager fm = getFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); fm.beginTransaction(); Fragment fragOne = new SubFragment(); ft.show(fragOne); } else { FragmentManager fm = getFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); fm.beginTransaction(); // it's wrong , you just hide the fragment that not added to FragmentTransaction Fragment fragOne = new SubFragment(); ft.hide(fragOne); } } 

下面的代码为我工作..

 View frag = findViewById(R.id.fragment); frag.setVisibility(View.GONE);//Or View.INVISBLE