Использование панели инструментов с фрагментами
Я пытаюсь создать видоискатель, который пролистывает 3 разных фрагмента, каждый с другой панелью инструментов. Я реализовал новую панель инструментов в упражнении раньше и заставил ее работать, однако я пытаюсь заставить ее работать с фрагментами
Вот фрагмент кода
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout resource that'll be returned
View rootView = inflater.inflate(R.layout.fragment_home, container, false);
mToolbar = (Toolbar) rootView.findViewById(R.id.toolbar_home);
if (mToolbar != null) {
setSupportActionBar(mToolbar);
}
mToolbar.setTitle(null);
return rootView;
}
Я расширяю свой фрагмент с помощью Fragment
, однако я получаю сообщение об ошибке
Cannot resolve method setSupportActionBar
Я не уверен, как решить эту проблему, если я setSupportActionBar
код setSupportActionBar
, он перестанет работать с определенными устройствами?
Ответы
Ответ 1
Фрагменты не имеют такого метода setSupportActionBar()
. ActionBar является свойством Activity, поэтому, чтобы настроить вашу панель инструментов как actionBar, ваша деятельность должна простираться от ActionBarActivity, а затем вы можете вызвать свой фрагмент:
((ActionBarActivity)getActivity()).setSupportActionBar(mToolbar);
UPDATE
Если вы используете AppCompatActivity:
((AppCompatActivity)getActivity()).setSupportActionBar(mToolbar);
Ответ 2
Я видел много ответов, в которых упоминалось setSupportActionBar
для панели инструментов внутри Fragment
но этот подход может пойти не так, если у вас есть панель инструментов в Activity
и отдельная Toolbar
во Fragment
.
- При перемещении
setSupportActionBar
с панели инструментов "Активность" на панель инструментов "Фрагмент" вы можете столкнуться с дублированием MenuItem
даже если попытаетесь переопределить его с помощью setHasOptionsMenu(true)
. - Во-вторых, если вы хотите обновить панель инструментов активности, вы увидите, что ваши изменения не отражаются из-за
setSupportActionBar
внутри вашего фрагмента.
Поэтому, чтобы избежать этого, я рекомендую использовать методы панели инструментов, подобные этому, во внутреннем фрагменте, чтобы раздуть меню и использовать
toolbar = (Toolbar) view.findViewById(R.id.toolbar_frag);
toolbar.inflateMenu(R.menu.frag_menu_items);
Menu menu = toolbar.getMenu();
и использовать интерфейс Toolbar.OnMenuItemClickListener
для получения с событиями menuItems щелчков.
Изменить (раздел скопирован с MrEngineer13 ответ)
и если вы беспокоитесь о кнопке возврата, вы можете установить ее следующим образом
toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.ic_action_back));
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//What to do on back clicked
}
});
Ответ 3
С новой AppCompatActivity вы должны вызывать ее вместо ActionBarActivity:
((AppCompatActivity)getActivity()).setSupportActionBar(toolbar);
Ответ 4
Основываясь на ответе @Faisal Naseer. Вот полный пример (с несколькими примечаниями) для использования пользовательской Toolbar
с навигацией и меню во Fragment
fragment_home.xml
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"">
...
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar_home"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:title="Home" />
</androidx.constraintlayout.widget.ConstraintLayout>
HomeFragment.kt
class HomeFragment : BaseFragment() {
override fun onCreate(savedInstanceState: Bundle?) {
// setHasOptionsMenu(true): don't need this anymore
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_home, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
toolbar_home.setNavigationIcon(R.drawable.ic_back) // need to set the icon here to have a navigation icon. You can simple create an vector image by "Vector Asset" and using here
toolbar_home.setNavigationOnClickListener {
// do something when click navigation
}
toolbar_home.inflateMenu(R.menu.menu_home)
toolbar_home.setOnMenuItemClickListener {
when (it.itemId) {
R.id.action_add -> {
// do something
true
}
R.id.action_update -> {
// do something
true
}
else -> {
super.onOptionsItemSelected(it)
}
}
}
}
}
menu_home.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_add"
android:title="@string/add_device"
app:showAsAction="never" />
<item
android:id="@+id/action_update_room"
android:title="@string/update_room"
app:showAsAction="never" />
</menu>
Надеюсь, это поможет
![enter image description here]()
Ответ 5
Вы можете добавить панель инструментов в Фрагменты, используя этот
((YOUR_ACTIVITY) getActivity()).getDelegate().setSupportActionBar(toolbar);