2016-06-12 3 views
1

Я сделал одну активность с NavigationView (открыт с кнопкой переключения):Переключение Внутри фрагмента

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener{ 

private DrawerLayout drawer; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_layout); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
      this, drawer, toolbar, R.string.app_name, R.string.app_name); 
    drawer.addDrawerListener(toggle); 
    toggle.syncState(); 
    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 
    if (navigationView != null) { 
     navigationView.setNavigationItemSelectedListener(this); 
     navigationView.setItemIconTintList(null); 
     navigationView.getMenu().getItem(0).setChecked(true); 
    } 
} 

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


@Override 
public boolean onNavigationItemSelected(MenuItem item) { 
    Fragment fragment = null; 
    Class fragmentClass; 

      fragmentClass = FirstFragment.class; 

      try { 
       fragment = (Fragment) fragmentClass.newInstance(); 
      } catch (InstantiationException | IllegalAccessException e) { 
       e.printStackTrace(); 
      } 

      break; 
    } 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    fragmentManager.beginTransaction().replace(R.id.layout, fragment).commit(); 
    item.setChecked(true); 
    setTitle(item.getTitle()); 
    drawer.closeDrawers(); 
    return true; 
} 
} 

Когда я выбираю один пункт NavigationView начинается фрагмент:

public class FirstFragment extends Fragment { 

private View view; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    view = inflater.inflate(R.layout.activity_layout, container, false); 
    Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar); 
    ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar); 
    DrawerLayout drawer = (DrawerLayout) view.findViewById(R.id.drawer_layout); 
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
      getActivity(), drawer, toolbar, R.string.app_name, R.string.app_name); 
    drawer.addDrawerListener(toggle); 
    toggle.syncState(); 
    return view; 
} 
} 

Проблема: Когда я выбираю кнопку ≡, чтобы открыть NavigationView внутри фрагмента, и я выбираю элементы, которые он не открывает FirstFragment. Если я прокручусь слева, чтобы открыть NavigationView внутри фрагмента, и я выбираю элементы, которые он открывает FirstFragment. Как я могу повторно использовать onNavigationItemSelected из MyActivity на FirstFragment?

Edit:

Это acitivity_layout.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" 
android:id="@+id/drawer_layout" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="#ddffff" 
android:fitsSystemWindows="true"> 

<LinearLayout 
    android:id="@+id/list_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    //FragmentLayout 
    <RelativeLayout 
     android:id="@+id/layout" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     > 

     <include 
      android:id="@+id/bar" 
      layout="@layout/app_bar_main" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" /> 

      ... 

    </RelativeLayout> 

</LinearLayout> 


<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:background="#ddffff" 
    app:headerLayout="@layout/nav_header_main" 
    app:menu="@menu/activity_main_drawer" /> 

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

Вам нужно лучше объяснить, что вы пытаетесь сделать. –

+0

Я все еще смущен. Вы имеете в виду, что первый «FragmentTransaction» не работает? Или ящик не открывается? Вам не нужен другой «ActionBarDrawerToggle» в вашем «Фрагменте». В «Деятельности» должен быть только один. –

+0

Когда я выбираю ≡, внутри FirstFragment, он открывает навигационное меню, но когда я выбираю один элемент NavigationView, FragmentTransaction не работает. Если я проведу вправо, а не выбрав ≡, он отлично работает. – tomss

ответ

0

Основной причиной этого является то, что вы используете один и тот же макет в вашем Fragment, как вы в Activity и Toolbar находится внутри контейнера ViewGroup, вы совершаете транзакцию Fragment в. Как только Fragment был загружен своими DrawerLayout и Toolbar, он покрывает ActivityToolbar, поэтому ничего необычного. Однако переключатель в Fragment управляет ящиком в Fragment, и этот ящик является вторым NavigationView, который не был настроен так, как тот, который находится в Activity, поэтому ничего не происходит, когда вы нажимаете на выдвижной ящик, открытый с помощью переключателя. Но, если вы перетащите выдвижной ящик, тот, который открывается, на самом деле является ящиком Activity, а -NavigationView был настроен правильно, поэтому щелчок по нему работает так, как ожидалось.

Первая поправка заключается в перемещении Toolbar - его <include> элемент, то есть - к внешней стороне RelativeLayout вы используете в качестве Fragment контейнера. Это предотвратит затухание ActivityToolbar при загрузке Fragment s.

Второй шаг - определить отдельные XML-файлы разного формата для Fragment. Вы не хотите использовать один и тот же макет в Fragment, так как вы находитесь в Activity, главным образом потому, что это, вероятно, не совсем то, что вы намереваетесь, а также потому, что вы действительно не хотите иметь несколько избыточных DrawerLayout s, Toolbar s , и NavigationView s, что может вызвать проблемы, как вы видели.

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