2016-06-22 3 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 (названное так потому, что оно ранее было активным), в котором есть 1-2 фрагмента внутри. Это ListFragment с фрагментом, отображающим информацию о выбранных элементах (в качестве другого фрагмента, если mDualPane истинна или запущена в качестве отдельной операции в противном случае).

Я не могу найти способ заставить это работать, я устал изменять порядок выполнения вещей с помощью onCreate, onCreateView, onActivityCreated, но ошибка, которую я продолжаю получать, заключается в том, что mToolsListFragment имеет значение null в mToolsListFragment. SetContext (с);

+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, если вы хотите, чтобы переключаться между различными видами деятельности и не фрагментами. Надеюсь это поможет.

Смежные вопросы