2016-06-22 8 views
1

私は最後の数時間、SOを検索しようとしていましたが、回避策を作成しようとしていないソリューションは見つかりませんでした。私は自分のアプリケーション用のナビゲーションドロワーを作成しようとしていますが、そうするために、ベースアクティビティーをフラグメントに変更しようとしなければなりませんでした。結果は次のようになります。ナビゲーション・ドロワーを使用してフラグメントをネストする方法はありますか?

public class ToolReaderActivity extends Fragment implements ToolListFragment.OnToolSelectedListener, CompatActionBarNavListener, OnClickListener { 

    boolean mIsDualPane = false; 

    Context c; 

    ToolListFragment mToolListFragment; 
    InfoFragment mInfoFragment; 
    Fragment mContent; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     c = getActivity(); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     View rootView = inflater.inflate(R.layout.onepane_with_bar, container, false); 

     // find our fragments 
     mToolListFragment = (ToolListFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.toolList); 
     mInfoFragment = (InfoFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.toolInfo); 

     FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction(); 
     transaction.replace(R.id.toolList, mToolListFragment).commit(); 

     FragmentTransaction transaction2 = getActivity().getSupportFragmentManager().beginTransaction(); 
     transaction.replace(R.id.toolInfo, mInfoFragment).commit(); 

     mToolListFragment.setContext(c); 
     mToolListFragment.setOnToolSelectedListener(this); 

     View infoView = getView().findViewById(R.id.toolInfo); 
     mIsDualPane = infoView != null && infoView.getVisibility() == View.VISIBLE; 

     int catIndex = savedInstanceState == null ? 0 : savedInstanceState.getInt("catIndex", 0); 
     setUpActionBar(mIsDualPane, catIndex); 

     mToolListFragment.setSelectable(mIsDualPane); 
     restoreSelection(savedInstanceState); 

     if (savedInstanceState != null) { 
      //Restore the fragment's instance 
      mContent = getActivity().getSupportFragmentManager().getFragment(savedInstanceState, "mContent"); 
     } 

     return rootView; 
    } 

... 
... 
... 
} 

目的とする出力は、ナビゲーションドロワー、したがってフラグメントを含むアクティビティーです。フラグメントには、この主なアクティビティToolReaderActivity(以前はアクティビティだったので、その名前が付けられています)が含まれています。選択されたアイテム情報を示すフラグメントを持つListFragmentです(mDualPaneがtrueの場合は別のフラグメント、そうでない場合は別のアクティビティとして起動されます)。

私はこれを実行する方法を理解できません。onCreate、onCreateView、onActivityCreatedを使用して処理が順調に行われるのに疲れましたが、mToolsListFragmentではmToolsListFragmentがnullであるというエラーが発生します。 setContext(c);

+0

この行を 'mToolListFragment =(ToolListFragment)getActivity()。getSupportFragmentManager()。findFragmentById(R.id.toolList);'以下の 'transaction.replace(...)'に移動します。 –

答えて

0

NavigationDrawerは、次のコードで簡単に作成できます。ここで

public class MainActivity extends AppCompatActivity 
{ 
private NavigationView mNavigationView; 
private DrawerLayout mDrawerLayout; 
private Toolbar toolbar; 
private ActionBarDrawerToggle mDrawerToggle; 
private FragmentActivity fragment; 
private FragmentManager fragmentManager; 

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    initDrawerNavigation(); 
    fragmentManager = getFragmentManager(); 
} 

public void initDrawerNavigation() 
{ 
    toolbar = (Toolbar) findViewById(R.id.toolbar); 
    toolbar.setTitle(R.string.app_name); 
    setSupportActionBar(toolbar); 
    getSupportActionBar().setDisplayShowHomeEnabled(true); 

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
    mNavigationView = (NavigationView) findViewById(R.id.navigation_view); 
    mNavigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() 
    { 

     @Override 
     public boolean onNavigationItemSelected(MenuItem item) 
     { 
      item.setChecked(true); 

      switch (item.getItemId()) 
      { 
       case R.id.st_menu: 
        fragment = new FirstFragment(); 
        break; 

       case R.id.nd_menu: 
        fragment = new Second Fragment(); 
        break; 
      } 

      fragmentManager.beginTransaction().replace(R.id.container, fragment).commit(); 

      mDrawerLayout.closeDrawers(); 
      return true; 
     } 
    }); 

    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.drawer_open, 
      R.string.drawer_close) 
    { 
     // Called when a drawer has settled in a completely closed state. 
     public void onDrawerClosed(View view) 
     { 
      super.onDrawerClosed(view); 
     } 

     // Called when a drawer has settled in a completely open state. 
     public void onDrawerOpened(View drawerView) 
     { 
      super.onDrawerOpened(drawerView); 
     } 
    }; 

    mDrawerLayout.addDrawerListener(mDrawerToggle); 
} 

@Override 
protected void onPostCreate(Bundle savedInstanceState) 
{ 
    super.onPostCreate(savedInstanceState); 
    mDrawerToggle.syncState(); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu){ 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item){ 

    switch(item.getItemId()) 
    { 
     case android.R.id.home: 
      mDrawerLayout.openDrawer(GravityCompat.START); // OPEN DRAWER 
      return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 
} 

あなたはactivity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical"> 

<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/toolbar" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="?attr/colorPrimary" 
    android:minHeight="?attr/actionBarSize" 
    app:theme="@style/ThemeOverlay.AppCompat.ActionBar" /> 

<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:paddingBottom="@dimen/activity_vertical_margin" 
    tools:context=".MainActivity"> 

    <include 
     layout="@layout/your_layout" /> 

    <android.support.design.widget.NavigationView 
     android:id="@+id/navigation_view" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:choiceMode="singleChoice" 
     app:menu="@menu/navigation_items" /> 
</android.support.v4.widget.DrawerLayout> 

</LinearLayout> 

your_layoutは、あなたが望む何もすることができています。今、あなたはここのようなあなたのFirstFragmentクラスを定義します。

public class FirstFragment extends Fragment 
{ 
@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{ 
    ViewGroup view = (ViewGroup) inflater.inflate(R.layout.target_layout, container, false); 

    return view; 
} 
} 

あなたが活動していない断片の間で切り替えたい場合にも、この質問Navigation Drawer to switch between activitiesを参照することができます。お役に立てれば。

関連する問題