1

У меня есть MainActivity, в котором отображается фрагмент, содержащий TabLayout и ViewPager. Если я прокомментирую весь контент в моем onCreateView внутри SearchFragment, моя панель инструментов появится как ожидается.Название и опции панели инструментов исчезают на фрагменте

Моя проблема в том, что панель инструментов пуста, когда я использую FragmentTransaction для отображения моего фрагмента.

Фотографии поясняющие мою проблему Fragment with blank toolbar MainActivity with populated and titled toolbar

MainActivity.java

public class MainActivity extends AppCompatActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_main); 
    Toolbar myToolbar = (Toolbar) findViewById(R.id.my_toolbar); 
    setSupportActionBar(myToolbar); 

    SearchFragment searchFragment = new SearchFragment(); 

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 

    ft.add(searchFragment, null); 
    ft.addToBackStack(null); 
    ft.commit(); 
} 

@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 R.id.action_create_item: 
      //Button pushed in toolbar 
     default: 
      return super.onOptionsItemSelected(item); 
    } 
} 
} 

SearchFragment.java

public class SearchFragment extends Fragment { 
@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    inflater.inflate(R.menu.menu_main, menu); 
    super.onCreateOptionsMenu(menu, inflater); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    return super.onOptionsItemSelected(item); 
} 

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setHasOptionsMenu(true); 
} 

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

    FragmentActivity v = getActivity(); 

    v.setContentView(R.layout.searchfragment); 

    TabLayout tabLayout = (TabLayout) v.findViewById(R.id.tab_layout); 
    tabLayout.addTab(tabLayout.newTab().setText("Tab 1")); 
    tabLayout.addTab(tabLayout.newTab().setText("Tab 2")); 
    tabLayout.addTab(tabLayout.newTab().setText("Tab 3")); 
    tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); 

    final ViewPager viewPager = (ViewPager) v.findViewById(R.id.pager); 
    final PagerAdapter adapter = new PagerAdapter 
      (v.getSupportFragmentManager(), tabLayout.getTabCount()); 
    viewPager.setAdapter(adapter); 
    viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); 
    tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
     @Override 
     public void onTabSelected(TabLayout.Tab tab) { 
      viewPager.setCurrentItem(tab.getPosition()); 
     } 

     @Override 
     public void onTabUnselected(TabLayout.Tab tab) { 

     } 

     @Override 
     public void onTabReselected(TabLayout.Tab tab) { 

     } 
    }); 
    setHasOptionsMenu(true); 

    return super.onCreateView(inflater, container, savedInstanceState); 
} 
} 

searchfragment.xml

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

    <android.support.v7.widget.Toolbar 
     android:id="@+id/my_toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="?attr/actionBarSize" 
     android:background="@color/colorPrimaryDark" 
     android:elevation="4dp" 
     android:theme="@style/ThemeOverlay.AppCompat.ActionBar" 
     android:popupTheme="@style/ThemeOverlay.AppCompat.Light"/> 

    <android.support.design.widget.TabLayout 
     android:id="@+id/tab_layout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/toolbar" 
     android:elevation="6dp" 
     android:minHeight="?attr/actionBarSize" 
     /> 

    <android.support.v4.view.ViewPager 
     android:id="@+id/pager" 
     android:layout_width="match_parent" 
     android:layout_height="fill_parent" 
     android:layout_below="@id/tab_layout"/> 

</LinearLayout> 

и, наконец, activity_main.xml

<RelativeLayout 
    android:id="@+id/main_layout" 
    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" 
    tools:context=".MainActivity"> 

    <android.support.v7.widget.Toolbar 
     android:id="@+id/my_toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="?attr/actionBarSize" 
     android:background="@color/colorPrimaryDark" 
     android:elevation="4dp" 
     android:theme="@style/ThemeOverlay.AppCompat.ActionBar" 
     app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/> 

    <FrameLayout 
     android:id="@+id/fragmentContainer" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="1"/> 

</RelativeLayout> 
+0

Что такое v.setContentView (R.layout.searchfragment); в фрагменте? Вы должны сделать это с помощью надувного макета. – Harry

+0

Я выяснил, что мне нужно использовать setContentView с макетом фрагментов, содержащим TabLayout, или я получу исключение nullinterinter для объекта tabLayout. Я проверяю, что вы имеете в виду под малым раздувом, потому что я точно не знаю, что вы имеете в виду. – Hylle

ответ

0

Попробуйте это ..

setDisplayOptions(ActionBar.DISPLAY_SHOW_TITLE) в MainActivity.java

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    ... 

    Toolbar myToolbar = (Toolbar) findViewById(R.id.my_toolbar); 
    setSupportActionBar(myToolbar); 
    if (getSupportActionBar() != null) { 
      getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_TITLE); 
    } 

    ... 

} 

и установить Title в onCreateView метод SearchFragment.java

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

    ... 

    getActivity().serTitle("My Fragment"); 

    ... 

} 
+0

К сожалению, это не делает никаких изменений. Панель действий по-прежнему пуста. Теперь я попытаюсь сделать суперпростую деятельность и фрагмент с помощью только панели действий - нет viewpager или tablayout. – Hylle

2

Я обнаружил, что проблема заключается в том, что панель инструментов установлена ​​в верхней части onCreateView. Я должен установить панель инструментов в самом низу OnCreateView на моем SearchFragment, например, так:

 FragmentActivity v = getActivity(); 

    v.setContentView(R.layout.searchfragment); 

    TabLayout tabLayout = (TabLayout) v.findViewById(R.id.tab_layout); 
    tabLayout.addTab(tabLayout.newTab().setText("Tab 1")); 
    tabLayout.addTab(tabLayout.newTab().setText("Tab 2")); 
    tabLayout.addTab(tabLayout.newTab().setText("Tab 3")); 
    tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); 

    final ViewPager viewPager = (ViewPager) v.findViewById(R.id.pager); 
    final PagerAdapter adapter = new PagerAdapter 
      (v.getSupportFragmentManager(), tabLayout.getTabCount()); 
    viewPager.setAdapter(adapter); 
    viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); 
    tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
     @Override 
     public void onTabSelected(TabLayout.Tab tab) { 
      viewPager.setCurrentItem(tab.getPosition()); 
     } 

     @Override 
     public void onTabUnselected(TabLayout.Tab tab) { 

     } 

     @Override 
     public void onTabReselected(TabLayout.Tab tab) { 

     } 
    }); 
    Toolbar myToolbar = (Toolbar) v.findViewById(R.id.my_toolbar); 
    ((AppCompatActivity)getActivity()).setSupportActionBar(myToolbar); 
    setHasOptionsMenu(true); 
    v.setTitle("Mit fragment"); 

Так панель инструментов должен быть один из последних пунктов, которые будут сделаны, я предполагаю.

+0

Странное решение, но работало на меня. Установка текста панели инструментов в качестве последнего утверждения в onCreate(); –

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