2016-05-31 56 views
1

我已經發現了很多關於此問題的內容,但我確實無法解決我的問題。我在這裏花了幾個小時,但沒有。無法從導航抽屜項目加載片段

我有一個使用Android Studio 2.1.1模板製作的導航抽屜活動。當然,我想要改變我的應用的視圖,當我點擊菜單中的一個項目時,顯示不同的碎片。這是我在MainActivity代碼:

 public boolean onNavigationItemSelected(MenuItem item) { 
     // Handle navigation view item clicks here. 
     int id = item.getItemId(); 

     if (id == R.id.nav_camera) { 

      Context context = getApplicationContext(); 
      CharSequence text = "Hello toast!"; 
      int duration = Toast.LENGTH_SHORT; 

      Toast toast = Toast.makeText(context, text, duration); 
      toast.show(); 

      new gaussFragment(); 

     } else if (id == R.id.nav_gallery) { 

     } else if (id == R.id.nav_slideshow) { 

     } else if (id == R.id.nav_manage) { 

     } else if (id == R.id.nav_share) { 

     } else if (id == R.id.nav_send) { 

     } 

     DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     drawer.closeDrawer(GravityCompat.START); 
     return true; 
    } 

當我點擊抽屜式導航欄(在一個id爲R.id.nav_camera)的第一個項目,我可以看到的烤麪包,但新的片段沒有出現。我使用這個代碼在gaussFragment()

public class gaussFragment extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     return inflater.inflate(R.layout.fragment_gauss, container, false); 
    } 

} 

當然,你可以看到here的fragment_gauss.xml是有這個代碼,它的相對佈局:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="info.androidhive.tabsswipexx.gaussFragment"> 

    <!-- TODO: Update blank fragment layout --> 
    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:text="@string/hello_blank_fragment" /> 

</FrameLayout> 

我怎麼能解決這個問題?


content_main是我在應用程序啓動時看到的第一個東西。我應該嘗試添加一些像

<FrameLayout 
     android:id="@+id/content_frame" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

並以某種方式加載我的碎片?

+0

好選擇每次都被顯示出來,你犯了一個新的片段d它立即被垃圾收集......你需要一個FragmentTransaction來將它加載到FrameLayout中 –

+0

我怎麼能編碼它? –

+0

看看[文檔](https://developer.android.com/training/basics/fragments/fragment-ui.html)是否有幫助,然後再回答問題。 –

回答

2

如果您使用由Android工作室在導航抽屜主要活動提供XML然後抽屜式導航模板,你會發現這樣的:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.DrawerLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/drawer_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true" 
    tools:openDrawer="start"> 

    <!-- The main content view --> 
    <include layout="@layout/app_bar_main" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

    <!-- the navigation drawer the comes from the left--> 
    <android.support.design.widget.NavigationView 
     android:id="@+id/nav_view" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:fitsSystemWindows="true" 

     app:headerLayout="@layout/nav_header_main" 
     app:menu="@menu/activity_main_drawer" /> 

</android.support.v4.widget.DrawerLayout> 

如果你仔細看看那裏你會看到它包括我爲你評論的兩個主要部分。一個是導航抽屜的東西,另一個是主要內容。如果按Ctrl +點擊layout="@layout/app_bar_main"你會看到另一個XML打開是以下幾點:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.design.widget.CoordinatorLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true" 
    tools:context="copsonic.com.SoundExchange.demoApp.MainActivity"> 

    <!--Main View tool bar--> 
    <android.support.design.widget.AppBarLayout 
     android:layout_height="wrap_content" 
     android:layout_width="match_parent" 
     android:theme="@style/AppTheme.AppBarOverlay"> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="?attr/actionBarSize" 
      android:background="?attr/colorPrimary" 
      app:popupTheme="@style/AppTheme.PopupOverlay" /> 

    </android.support.design.widget.AppBarLayout> 

    <!--The content that will be displayed in the main view when the navigation drawer is not opened--> 
    <include layout="@layout/content_main" /> 

    <!--Floating Action Button Stuff--> 
    <android.support.design.widget.FloatingActionButton 
     android:id="@+id/fab" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="bottom|end" 
     android:layout_margin="@dimen/fab_margin" 
     android:scaleType="center" 
     android:src="@mipmap/ic_rx_tx" 
     android:saveEnabled="false" 
     app:backgroundTint="#000000" 
     android:adjustViewBounds="false" /> 



</android.support.design.widget.CoordinatorLayout> 

在那裏你會看到3個主要部分,一個工具欄,一個浮動操作按鈕和控制最後一個用於導航抽屜未打開時將顯示在主視圖中的內容,這是您關心的內容。如果按Ctrl +單擊<include layout="@layout/content_main" />您將看到第三個xml,您必須添加一個Fragmet容器。到底這件事情是這樣的:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" 
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior" 
    tools:showIn="@layout/app_bar_main" 
    tools:context="copsonic.com.SoundExchange.demoApp.MainActivity"> 

    <!-- A fragmet container to dynamically swap between fragmets--> 
    <FrameLayout 
     android:id="@+id/fragment_container" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

</RelativeLayout> 

所以這一切後,從您的主要活動代碼,你只需要做兩兩件事,一是管理哪些片段將被首先看到的,您在OnCreate方法做到這一點通過添加:

FragmentTransmitter initialFragment = new FragmentTransmitter(); 


// Check that the activity is using the layout version with 
// the fragment_container FrameLayout 
if (findViewById(R.id.fragment_container) != null) { 

     // this check allows you not to load the default fragment unless 
     //it's the first time you launch the activity after having destroyed it 
     if (savedInstanceState != null) { 
      return; 
     } 

    // Create the fragment that is seen the first time your app opens 

    //pass useful info to the fragment from main activity if needed 
    //(it is recommended not to do this in the constructor, so you have to do it through a Bundle) 
    Bundle args = new Bundle(); 
    args.putSerializable("ModulationType",aModulation); 
    initialFragment.setArguments(args); 


    // In case this activity was started with special instructions from an 
    // Intent, pass the Intent's extras to the fragment as arguments 
    //initialFragment.setArguments(getIntent().getExtras()); 

    // Add the fragment to the 'fragment_container' FrameLayout 
    getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, initialFragment).commit(); 

} 

然後第二件事是妥善處理該片段將一個選項是在導航抽屜

public boolean onNavigationItemSelected(MenuItem item) { 
     // Handle navigation view item clicks here. 
     int id = item.getItemId(); 

     if (id == R.id.nav_camera) { 

      Context context = getApplicationContext(); 
      CharSequence text = "Hello toast!"; 
      int duration = Toast.LENGTH_SHORT; 

      Toast toast = Toast.makeText(context, text, duration); 
      toast.show(); 

      FragmentTransmitter Gauss= new new gaussFragment(); 

      //pass useful info to fragment if needed 
      Bundle args = new Bundle(); 
      args.putSerializable(getString(R.string.ModulationType),aModulation); 
      Gauss.setArguments(args); 

      FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
      transaction.replace(R.id.fragment_container, Gauss,"TAG_GaussFragment"); //pacing a tag is not mandatory but it is pretty useful if you want to know later which fragment is being displayed in the fragment container 
      //transaction.addToBackStack(null); 
      transaction.commit(); 



     } else if (id == R.id.nav_gallery) { 

     } else if (id == R.id.nav_slideshow) { 

     } else if (id == R.id.nav_manage) { 

     } else if (id == R.id.nav_share) { 

     } else if (id == R.id.nav_send) { 

     } 

     DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     drawer.closeDrawer(GravityCompat.START); 
     return true; 
    }