2つのフラグメントを含むアプリケーションを開発していますが、必要に応じて非表示にしたいです。次のコードに私の問題の簡単な例を示します。この単純なFragmentactivityには、1つのボタンと1つのリストフラグメントが含まれます。
この簡単な例は問題なく動作します。しかし、私はshow hide fragmentには満足していません。 layout.setVisibility(View.GONE);を削除した場合コードからft.hide(f);フラグメントを非表示にしません。実際、コンテナを隠しているフラグメントを隠していません。
私の質問は、ISこれは非表示フラグメントを表示する方法ですか?そうでない場合は、多くの人がこの問題に直面しているため、テスト済みのフラグメントでフラグメントを非表示および表示する方法を説明してください。
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
}
コンテナの可視性フラグを台無しにしないでください-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.Fragmentを使用している場合
FragmentManager fm = getSupportFragmentManager();
fm.beginTransaction()
.setCustomAnimations(Android.R.anim.fade_in, Android.R.anim.fade_out)
.show(somefrag)
.commit();
さらに、フラグメントで行うことができます(たとえば、サーバーデータの取得に失敗した場合)。
getView().setVisibility(View.GONE);
こんにちは、このアプローチを使用してそれを行うと、最初に追加されたすべてのフラグメントがコンテナに残り、目的のフラグメントを単に表示し、コンテナ内の他のフラグメントを非表示にします。
// 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 を参照してください。私は誰でも助けてくれることを願っています。たとえこれが古い質問であっても。
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();
}
これを試して:
MapFragment mapFragment = (MapFragment)getFragmentManager().findFragmentById(R.id.mapview);
mapFragment.getView().setVisibility(View.GONE);
これは私のために働いた
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();
ここでの答えは正しいですし、私は@Jyoのショーと隠しフラグメント実装のホイフのアイデアが好きでしたまだない場合はフラグメント
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>