2017-10-15 42 views
-2

我有一個MainActivity和其他Fragments當用戶點擊NavigationViewer時打開WebView。我在導航視圖中添加了主頁Fragment,但我不知道如何將其設置爲默認值,以便如果用戶打開該應用程序,則會打開默認主頁Fragment。我是否必須創建另一個Java類或使用MainActivity。 Java作爲家庭?如果是,我該如何使用MainActivity。 Java作爲家庭Fragment?如果用戶單擊其他Fragment打開WebView並按下後退按鈕,如何使其返回到默認主頁Fragment?此刻,如果我按下後退按鈕,它會直接破壞應用程序並返回到手機背景。如何使mainactivity成爲主頁片段?

回答

0

如果你有一個啓動,活動具有片段提供商設置的內容,你可能要存儲默認片段莫名其妙。

通常你開始你的活動,並有一個FragmentManager用一個片段替換你的部分內容。

如果您想要根據邏輯改變行爲,您希望使用SharedPreferences或任何其他存儲技術(如SQLite)以Ids或類似方式存儲起始片段。

0

我假設你在onNavigationItemSelected使用片段之間改變FragmentManager此類似:爲你做什麼

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

如果你想在活動開始時打開片段,你必須是完全一樣在onNavigationItemSelected,你必須調用FragmentManageronCreate,也使選擇在NavigationView項目:

navigationView.setCheckedItem(R.id.home_fragment); 

至於背部b 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

第一套某種「容器」在你的MainActivityLayout其中將包含Fragment

<FrameLayout 
      android:id="@+id/container" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_above="@+id/indications_LL" 
      > 
</FrameLayout> 

然後設置FragmentManagerFragmentTransaction

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

不要忘記:

private FragmentManager fragmentManager = getFragmentManager(); 
private FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
如果你想在你的 onCreate()方法來啓動與主 Fragment 添加以下代碼

添加碎片到BackStack:

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

低於我的示例代碼看看:

/** 
* 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(); 
} 

對於backbutton必須@OverrideonBackPressed()方法。然後,你可以使用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(); 
     } 
相關問題