Как получить панель инструментов из фрагмент?
Я ActionBarActivity
с NavigationDrawer
и использовать support_v7 Toolbar
Как ActionBar. В одном из моих фрагментов панель инструментов имеет пользовательский вид. В других фрагментах Toolbar
должен показать название.
как сделать Toolbar
экземпляр для настройки из фрагментов? Я могу получить ActionBar с getActivity().getActionBar()
, но если я позвоню setTitle()
для этого экземпляра ActionBar он ничего не делает.
UPD:
в моем случае
((ActionBarActivity) getActivity()).getSupportActionBar().setTitle();
(как сказал MrEngineer13) не надо работайте над созданием первого фрагмента, потому что я вызываю его из onHiddenChanged(). Теперь я добавляю еще один в onCreateView (), и он отлично работает.
7 ответов:
вы должны бросить свою деятельность с
getActivity()
toAppCompatActivity
первый. Вот пример:((AppCompatActivity) getActivity()).getSupportActionBar().setTitle();
причина, по которой вы должны бросить это, потому что
getActivity()
возвращает aFragmentActivity
и вам нуженAppCompatActivity
в случае, если фрагменты должны иметь пользовательский вид панели инструментов, вы можете реализовать панель инструментов для каждого фрагмента отдельно.
добавить панель инструментов в fragment_layout:
<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; } });
у вас есть два варианта сделать панель на фрагмент
первый
Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar);
и
Toolbar toolbar = ((MainActivity) getActivity()).mToolbar;
toolbar = (Toolbar) getView().findViewById(R.id.toolbar); AppCompatActivity activity = (AppCompatActivity) getActivity(); activity.setSupportActionBar(toolbar);
может быть, вы должны попробовать
getActivity().getSupportActionBar().setTitle()
Если вы используете support_v7.
из вашего фрагмента: (получить панель инструментов из фрагмента?)
// 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 или custom вид на панели инструментов из фрагмента!
из вашей деятельности:
// get toolbar this.getToolbar(); // get Action Bar this.getSupportActionBar();