2017-10-15 8 views
-2

MainActivityFragmentsがあり、ユーザーがNavigationViewerをクリックするとWebViewが開きます。ホームビューFragmentをナビゲーションビューに追加しましたが、ユーザーがアプリケーションを開くと、デフォルトの家庭Fragmentが開くように、デフォルトにする方法がわかりません。別のJavaクラスを作成するか、MainActivityを使用する必要がありますか。家庭としてのJava?はいの場合は、どうすればMainActivityを使用しますか?家庭のJava Fragment?そして、ユーザが他のFragmentをクリックしてWebViewを開き、バックボタンを押すと、それをデフォルトの家屋Fragmentに戻す方法を教えてください。現時点で、私がバックボタンを押すと、それは文字通りAppを破壊し、Phoneのバックグラウンドに戻ります。mainactivityをホームフラグメントとするには?

答えて

0

コンテンツを設定するフラグメントプロバイダがあるLauncher-Activityをお持ちの場合は、何らかの理由でデフォルトのフラグメントを保存することができます。

通常、アクティビティを開始し、コンテンツの一部をフラグメントに置き換えるFragmentManagerがあります。

論理に応じて動作が変化したい場合は、SharedPreferencesやSQLiteのような他の格納技術を使用して、Idなどの開始フラグメントを保存します。

0

私はあなたがこれに似FragmentManagerを使用してonNavigationItemSelectedにフラグメント間に変化していると仮定します。

FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
ft.replace(R.id.content_frame, new HomeFragment); 
ft.commit(); 

あなたが活動を開始したときにフラグメントを開きたい場合は、何をする必要がすることは、あなたが何をするかにまったく同じですバックbのよう

navigationView.setCheckedItem(R.id.home_fragment); 

onNavigationItemSelectedに、あなたが選択したNavigationViewの項目onCreateFragmentManagerに電話しても確認する必要がありますutton、あなたはonBackPressed関数を無効にする必要があります。あなたは、Android Studioからナビゲーションドロワーのテンプレートを使用している場合、それは次のようになります。あなたは、単に他の部分にあなたのロジックを追加することができます

@Override 
public void onBackPressed() { 
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    if (drawer.isDrawerOpen(GravityCompat.START)) { 
     drawer.closeDrawer(GravityCompat.START); 
    } else { 
     super.onBackPressed(); 
    } 
} 

、あなたはFragmentManagerから見/それへの参照を保持することによって、活性フラグメントを追跡することができます(またはナビゲーションドロワーの選択した項目を見て)と、それに応じて動作させる:

Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.content_frame) 
if(currentFragment instanceof HomeFragment) 
    super.onBackPressed(); 
else { 
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    ft.replace(R.id.content_frame, new HomeFragment); 
    ft.commit(); 
} 
0

まずFragmentが含まれていますあなたのMainActivityLayoutに「コンテナ」のいくつかの種類を設定します。

はその後FragmentManagerFragmentTransactionを設定します。

private FragmentManager fragmentManager = getFragmentManager(); 
private FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 

あなたonCreate()方法でメインFragmentで起動したい場合は 以下のコードを追加しますことを忘れないでください

fragmentTransaction.add(R.id.container, new MainFragment(), *"set Tag for your fragment"*); 

をフラグメントをBackStackに追加します。

ragmentTransaction.addToBackStack(*"Your Fragment Tag"*) 

以下の私のコード例を見てみましょう:あなたはonBackPressed()方法を@Overrideしなければならないbackbuttonについて

/** 
* A fragment transaction Method 
* 
* @param fragment the fragment we want to display 
*/ 
private void setFragmentTransaction(Fragment fragment, MainMenus tagName) { 


    fragmentManager = getFragmentManager(); 
    fragmentTransaction = fragmentManager.beginTransaction(); 

    //replacing fragments new Fragments 
    if (fragment != null) { 
     fragmentTransaction.replace(R.id.container, fragment, tagName.toString()); 
    } else if (fragment == null && (fragmentManager.getBackStackEntryCount() == 0)) { // starting with main Fragment 
     fragmentTransaction.add(R.id.container, new MainFragment(), MainMenus.MAIN_MENUS.toString()); 
    } 
    if (tagName == null) { 
     fragmentTransaction.addToBackStack(null); 
    } else { 
     fragmentTransaction.addToBackStack(tagName.toString()); 
    } 
    fragmentTransaction.commitAllowingStateLoss(); 
    fragmentManager.executePendingTransactions(); 
} 

を。それが特定のフラグメントの数に達したとき、あなたはFragment's TAGたりすることができますpopBackStack()を使用してbackPressを扱うことができます。

 @Override 
     public void onBackPressed() { 

    //The first method, using TAG 
      if (fragmentManager.findFragmentByTag(* "Your Fragment TAG" *.toString()) !=null){ 
       fragmentManager.popBackStack() 
      } 


    //The second method: if more than two fragment, delete fragment stack 
      if (fragmentManager.getBackStackEntryCount() > 3) { 
       fragmentManager.popBackStack(); 
      } 
super.onBackPressed(); 
     } 
: 以下の例を見てみましょう
関連する問題