Show hide fragment in android

我正在开发的应用程序,其中包含2个片段,我想显示隐藏根据我的需要。下面的代码是我的问题的简单例子。 This simple Fragmentactivity contains 1 button and one listfragment.

这个简单的例子完美无缺。但是我不满足于展示皮片。如果从代码中删除 layout.setVisiability (View.GONE) ; ,那么 ft.hide (f) ; 将不会隐藏片段。事实上我们不是在隐藏碎片,我们是在隐藏容器。

我的问题是,这是展示皮肤碎片的方法吗?如果没有,请用测试的例子解释如何隐藏和显示碎片,因为很多人都面临这个问题。

 public class MainActivity extends FragmentActivity implements OnClickListener {


Fragment1 f;
Button b;
LinearLayout layout;
Fragment myf;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
b = (Button) findViewById(R.id.button1);
layout = (LinearLayout) findViewById(R.id.ll);
f = new Fragment1();
}


@Override
public void onClick(View v) {


FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out);


if (f.isHidden()) {
ft.show(f);
layout.setVisibility(View.VISIBLE);
b.setText("Hide");
} else {
ft.hide(f);
b.setText("Show");
layout.setVisibility(View.GONE);
}
ft.commit();
// TODO Auto-generated method stub
}
206338 次浏览

不要破坏容器的可见性标志-FragmentTransaction.hide/show 在内部为您做这些事情。

所以正确的做法是:

FragmentManager fm = getFragmentManager();
fm.beginTransaction()
.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out)
.show(somefrag)
.commit();

或者,如果您使用的是 android.support. v4.app. 片段

 FragmentManager fm = getSupportFragmentManager();
fm.beginTransaction()
.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out)
.show(somefrag)
.commit();

另外,您可以在一个片段中执行(例如,当获取服务器数据失败时) :

 getView().setVisibility(View.GONE);
public void showHideFragment(final Fragment fragment){


FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.setCustomAnimations(android.R.animator.fade_in,
android.R.animator.fade_out);


if (fragment.isHidden()) {
ft.show(fragment);
Log.d("hidden","Show");
} else {
ft.hide(fragment);
Log.d("Shown","Hide");
}


ft.commit();
}

嗨,你可以通过使用这种方法来做到这一点,所有的片段在最初添加之后都将保留在容器中,然后我们只是显示所需的片段并将其他片段隐藏在容器中。

// Within an activity
private FragmentA fragmentA;
private FragmentB fragmentB;
private FragmentC fragmentC;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
fragmentA = FragmentA.newInstance("foo");
fragmentB = FragmentB.newInstance("bar");
fragmentC = FragmentC.newInstance("baz");
}
}




// Replace the switch method
protected void displayFragmentA() {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
if (fragmentA.isAdded()) { // if the fragment is already in container
ft.show(fragmentA);
} else { // fragment needs to be added to frame container
ft.add(R.id.flContainer, fragmentA, "A");
}
// Hide fragment B
if (fragmentB.isAdded()) { ft.hide(fragmentB); }
// Hide fragment C
if (fragmentC.isAdded()) { ft.hide(fragmentC); }
// Commit changes
ft.commit();
}

请参阅 https://github.com/codepath/android_guides/wiki/Creating-and-Using-Fragments了解更多信息。我希望我能帮助任何人。即使这是一个老问题。

这招对我很管用

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
if(tag.equalsIgnoreCase("dashboard")){


DashboardFragment dashboardFragment = (DashboardFragment)
fragmentManager.findFragmentByTag("dashboard");
if(dashboardFragment!=null) ft.show(dashboardFragment);


ShowcaseFragment showcaseFragment = (ShowcaseFragment)
fragmentManager.findFragmentByTag("showcase");
if(showcaseFragment!=null) ft.hide(showcaseFragment);


} else if(tag.equalsIgnoreCase("showcase")){
DashboardFragment dashboardFragment = (DashboardFragment)
fragmentManager.findFragmentByTag("dashboard");
if(dashboardFragment!=null) ft.hide(dashboardFragment);


ShowcaseFragment showcaseFragment = (ShowcaseFragment)
fragmentManager.findFragmentByTag("showcase");
if(showcaseFragment!=null) ft.show(showcaseFragment);
}


ft.commit();

试试这个:

MapFragment mapFragment = (MapFragment)getFragmentManager().findFragmentById(R.id.mapview);
mapFragment.getView().setVisibility(View.GONE);

这里的答案是正确的,我喜欢@Jyo 显示和隐藏片段实现的 Whiff 想法,除了他目前使用的方法会在第一次运行时隐藏片段,所以我添加了一个小小的改变,即我添加了 isAdd 检查,如果片段还没有显示,就显示它

public void showHideCardPreview(int id) {
FragmentManager fm = getSupportFragmentManager();
Bundle b = new Bundle();
b.putInt(Constants.CARD, id);
cardPreviewFragment.setArguments(b);
FragmentTransaction ft = fm.beginTransaction()
.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out);
if (!cardPreviewFragment.isAdded()){
ft.add(R.id.full_screen_container, cardPreviewFragment);
ft.show(cardPreviewFragment);
} else {
if (cardPreviewFragment.isHidden()) {
Log.d(TAG,"++++++++++++++++++++ show");
ft.show(cardPreviewFragment);
} else {
Log.d(TAG,"++++++++++++++++++++ hide");
ft.hide(cardPreviewFragment);
}
}


ft.commit();
}

根据我的代码,与上面的解决方案相比,最简单的方法是定义一个包含片段的布局,然后通过控制与一般视图方式对齐的布局属性来隐藏或者取消隐藏片段。在这种情况下,不需要额外的代码,片段的额外部署属性也可以移动到外部布局中。

<LinearLayout style="@style/StHorizontalLinearView"
>


<fragment
android:layout_width="match_parent"
android:layout_height="390dp"
android:layout_alignParentTop="true"
/>


</LinearLayout>
final Fragment fragment1 = new fragment1();
final Fragment fragment2 = new fragment2();
final FragmentManager fm = getSupportFragmentManager();
Fragment active = fragment1;

在 onCreate 中,在 setContentView 之后,我隐藏了两个片段并将它们提交给片段管理器,但是我没有隐藏第一个作为主片段的片段。

fm.beginTransaction().add(R.id.main_container, fragment2, "2").hide(fragment2).commit();
fm.beginTransaction().add(R.id.main_container,fragment1, "1").commit();
@Override
public void onClick(View v) {
Fragment another = fragment1;
if(active==fragment1){
another = fragment2;
}
fm.beginTransaction().hide(active).show(another).commit();
active = another;
}

档号: https://medium.com/@oluwabukunmi.aluko/bottom-navigation-view-with-fragments-a074bfd08711

也许我来得太晚了,但这对将来的人有帮助。
这个答案是对 mangu23 < a href = “ https://stackoverflow.com/a/31197906/6628335”> 答案的修改
我只是添加了一个 for 循环,以避免重复,并且不需要样板代码就可以轻松地添加更多片段。

我们首先需要一个应该显示的 片段列表

public class MainActivity extends AppCompatActivity{
//...
List<Fragment> fragmentList = new ArrayList<>();
}

然后我们需要用我们的碎片来填满它

@Override
protected void onCreate(Bundle savedInstanceState) {
//...
HomeFragment homeFragment = new HomeFragment();
MessagesFragment messagesFragment = new MessagesFragment();
UserFragment userFragment = new UserFragment();
FavoriteFragment favoriteFragment = new FavoriteFragment();
MapFragment mapFragment = new MapFragment();


fragmentList.add(homeFragment);
fragmentList.add(messagesFragment);
fragmentList.add(userFragment);
fragmentList.add(favoriteFragment);
fragmentList.add(mapFragment);
}

And we need a way to know which fragment were selected from the list, so we need getFragmentIndex function

private int getFragmentIndex(Fragment fragment) {
int index = -1;
for (int i = 0; i < fragmentList.size(); i++) {
if (fragment.hashCode() == fragmentList.get(i).hashCode()){
return i;
}
}
return index;
}

最后,displayFragment方法将如下所示:

private void displayFragment(Fragment fragment) {
int index = getFragmentIndex(fragment);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
if (fragment.isAdded()) { // if the fragment is already in container
transaction.show(fragment);
} else { // fragment needs to be added to frame container
transaction.add(R.id.placeholder, fragment);
}
// hiding the other fragments
for (int i = 0; i < fragmentList.size(); i++) {
if (fragmentList.get(i).isAdded() && i != index) {
transaction.hide(fragmentList.get(i));
}
}
transaction.commit();
}

这样,我们可以例如调用 displayFragment(homeFragment)
这将自动显示 HomeFragment并隐藏列表中的任何其他片段。
这个解决方案允许您向 fragmentList追加更多的片段,而不必重复旧版 displayFragment中的 if语句。
我希望有人会发现这个有用。