Как получить панель инструментов из фрагмента?
У меня ActionBarActivity
с NavigationDrawer
и используйте support_v7 Toolbar
как ActionBar. На одной из моих панелей инструментов есть пользовательский вид. В других фрагментах Toolbar
должен отображаться заголовок.
Как получить экземпляр Toolbar
для настройки из фрагментов? Я могу получить ActionBar с getActivity().getActionBar()
, но если я вызову setTitle()
для этого экземпляра ActionBar, он ничего не сделает.
UPD:
В моем случае
((ActionBarActivity) getActivity()).getSupportActionBar().setTitle();
(как сказал MrEngineer13) не работают при создании первого фрагмента, потому что я вызываю его из onHiddenChanged(). Теперь я добавляю больше одного в onCreateView(), и он отлично работает.
Ответы
Ответ 1
Сначала вам нужно выполнить свою деятельность с getActivity()
до AppCompatActivity
. Вот пример:
((AppCompatActivity) getActivity()).getSupportActionBar().setTitle();
Причина, по которой вы должны ее использовать, заключается в том, что getActivity()
возвращает FragmentActivity
, и вам нужно AppCompatActivity
Ответ 2
В случае, если фрагменты должны иметь пользовательский вид ToolBar, вы можете реализовать ToolBar для каждого фрагмента отдельно.
добавить ToolBar в фрагмент_раздела:
<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimaryDark"/>
найти его в фрагменте:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment, container, false);
Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar);
//set toolbar appearance
toolbar.setBackground(R.color.material_blue_grey_800);
//for crate home button
AppCompatActivity activity = (AppCompatActivity) getActivity();
activity.setSupportActionBar(toolbar);
activity.getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
Слушатель меню может быть создан двумя способами:
переопределить onOptionsItemSelected в вашем фрагменте:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()){
case android.R.id.home:
getActivity().onBackPressed();
}
return super.onOptionsItemSelected(item);
}
или установить прослушиватель для панели инструментов при создании в onCreateView():
toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
return false;
}
});
Ответ 3
У вас есть два варианта: получить панель инструментов в фрагменте
Первый
Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar);
и второй
Toolbar toolbar = ((MainActivity) getActivity()).mToolbar;
Ответ 4
toolbar = (Toolbar) getView().findViewById(R.id.toolbar);
AppCompatActivity activity = (AppCompatActivity) getActivity();
activity.setSupportActionBar(toolbar);
Ответ 5
Для пользователей Kotlin (activity as AppCompatActivity).supportActionBar?.show()
Ответ 6
Возможно, вам нужно попробовать getActivity().getSupportActionBar().setTitle()
, если вы используете support_v7.
Ответ 7
Из вашего фрагмента: (получить панель инструментов из фрагмента?)
// get toolbar
((MainAcivity)this.getActivity()).getToolbar(); // getToolbar will be method in Activity that returns Toolbar!! don't use getSupportActionBar for getting toolbar!!
// get action bar
this.getActivity().getSupportActionBar();
Это очень полезно, если вы используете spinner на панели инструментов и вызываете spinner или пользовательские представления на панели инструментов из фрагмента!
Из вашей деятельности:
// get toolbar
this.getToolbar();
// get Action Bar
this.getSupportActionBar();
Ответ 8
Вы можете создать метод для этого в классе Activity:
public void setToolbarTitle(String title) {
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setTitle(title);
}
И вы можете использовать вот так:
setToolbarTitle("Hello World");
Ответ 9
Я сделал это с помощью этих шагов.
- Установите заголовок, используя приведенный ниже код в
onCreateView
основного фрагмента.
((AppCompatActivity) getActivity()).getSupportActionBar().setTitle("Your title");
- Для переключения между фрагментами я использую нижнюю панель навигации, которая реализована в
MainActivity
(Parent Activity) фрагмента. Даже если вы используете любую кнопку или пункт меню, вы можете изменить заголовок с onSelectedItemClickListener
, как я это сделал в моем случае. public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
switch (menuItem.getItemId()){
case R.id.menu_dashboard:
getSupportActionBar().setTitle("Dashboard");
fm.beginTransaction().hide(active).show(dashboardFragment).commit();
active = dashboardFragment;
return true;
case R.id.menu_workshop:
getSupportActionBar().setTitle("Workshops");
fm.beginTransaction().hide(active).show(workshopFragment).commit();
active = workshopFragment;
return true;
}
return false;
}