Як отримати Панель інструментів з фрагмента?


107

У мене є ActionBarActivityз NavigationDrawerі використовувати support_v7 Toolbarв ActionBar. В одному з моїх фрагментів на панелі інструментів є спеціальний вигляд. В інших фрагментах Toolbarслід вказати заголовок.

Як отримати Toolbarекземпляр для налаштування з фрагментів? Я можу отримати ActionBar getActivity().getActionBar(), але якщо я закликаю setTitle()цей екземпляр ActionBar, він нічого не робить.

UPD:

У моєму випадку

((ActionBarActivity) getActivity()).getSupportActionBar().setTitle();

(як сказав MrEngineer13) спочатку не створюється фрагмент, тому що я називаю його від onHiddenChanged (). Тепер я додаю ще один у onCreateView (), і він прекрасно працює.


У фрагментах немає активних панелей дій / панелей інструментів
tyczj

(MainAcivity) this.getActivity ()). GetToolbar (); буде правильною відповіддю !! для отримання Панелі інструментів у фрагменті !!
LOG_TAG

Відповіді:


201

Ви повинні кинути вашу діяльність від getActivity()до AppCompatActivityпершої. Ось приклад:

((AppCompatActivity) getActivity()).getSupportActionBar().setTitle();

Причина, яку ви повинні віддати, це те, що getActivity()повертає a FragmentActivityі вам потрібноAppCompatActivity

У Котліні:

(activity as AppCompatActivity).supportActionBar?.title = "My Title"

8
отримання "supportActionBar" та "панелі інструментів" - це одне і те ж?
Дарпан

@Darpan не впевнений
Костянтин Конопко

Якщо я додам це, його зміна заголовка .. Але якщо я повернусь до батьківської діяльності, як знову змінити заголовок? Я маю на увазі, що у мене є ящик для навігації. Бічний ящик має деякі фрагменти, а основна діяльність має свою назву. Коли я встановлюю назву основної діяльності, вона працює і фрагментарно, так, як ви згадали, працював ідеально. Але як я повинен змінити назву діяльності, коли повертаюся назад?
Kylo Ren

82

У випадку, якщо фрагменти повинні мати спеціальний вигляд ToolBar, ви можете реалізувати ToolBar для кожного фрагмента окремо.

додати ToolBar у 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;
            }
        });

1
Я просто хочу підтвердити це правильним способом? якщо ми завантажимо різний фрагмент на панель інструментів у viewpager + Tablayout або Pagertabstripe, це вплине на ефективність програми під час перенесення?
LOG_TAG

1
@LOG_TAG У мене є проект ящика з кожним фрагментом, що реалізує панель інструментів (і, таким чином, маючи панель інструментів у своєму файлі компонування), і наведений вище код працював для мене чудово.
MattBoothDev

Дякую! Працював як HEYUL !! :) Btw, краще замінити батьківську активність onOptionsItemSelected()замість фрагмента, щоб уникнути повторення коду.
Aditya Naique

@ChadMx ні, чому він навіть писав про додавання панелі інструментів у xml тощо. Автор запитав, як програмно отримати панель інструментів з фрагмента. Тож stackoverflow.com/a/26998718/4548520 це найкраща / правильна відповідь і коротка
користувач25

43

У вас є два варіанти отримати панель інструментів у фрагменті

Перший

Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar);

і другий

Toolbar toolbar = ((MainActivity) getActivity()).mToolbar;

Але це правильний шлях .. bcoz у нас також єSupportedActionBar?
Code_Life

9
toolbar = (Toolbar) getView().findViewById(R.id.toolbar);
AppCompatActivity activity = (AppCompatActivity) getActivity();
activity.setSupportActionBar(toolbar);

2

Для користувачів Kotlin (activity as AppCompatActivity).supportActionBar?.show()


!!цілком можна уникнути, ?і це позбавить вас від можливої ​​аварії
JonZarate

Я вважаю, що це краще(activity as? AppCompatActivity)?.supportActionBar?.show()
JonZarate

1

Можливо, вам доведеться спробувати, getActivity().getSupportActionBar().setTitle()якщо ви використовуєте support_v7.


1

З вашого фрагмента: (отримати фрагмент панелі інструментів?)

// 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();

це дуже корисно, коли ви використовуєте спінер на Панелі інструментів і дзвоните за допомогою спінера або на власні подання на Панелі інструментів з фрагмента!

З вашої активності:

// get toolbar
this.getToolbar();
// get Action Bar
this.getSupportActionBar();

3
У вас має бути метод у вашій діяльності під назвою getToolbar () , що погано, адже саме так не має здійснюватися зв’язок між активністю та фрагментом.
Марко

2
так, немає іншого способу для цього !! багато хто з ящиків навігаційного ящика реалізує лише цей стиль !!! інколи нам потрібно відкинути активність через AppCompatActivity (AppCompatActivity) getActivity (), що є ще однією больовою точкою !!! все це
сповна

1

У XML

 <androidx.appcompat.widget.Toolbar
  android:id="@+id/main_toolbar"
  android:layout_width="match_parent"
  android:layout_height="?attr/actionBarSize"
  app:layout_scrollFlags="scroll|enterAlways">
 </androidx.appcompat.widget.Toolbar>

Котлін: У fragment.kt -> onCreateView ()

setHasOptionsMenu(true)

val toolbar = view.findViewById<Toolbar>(R.id.main_toolbar)

(activity as? AppCompatActivity)?.setSupportActionBar(toolbar)

(activity as? AppCompatActivity)?.supportActionBar?.show()

-> onCreateOptionsMenu ()

   override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
       inflater.inflate(R.menu.app_main_menu,menu)
       super.onCreateOptionsMenu(menu, inflater)
   }

-> onOptionsItemSelected ()

   override fun onOptionsItemSelected(item: MenuItem): Boolean {
        return when (item.itemId) {
             R.id.selected_id->{//to_do}
             else -> super.onOptionsItemSelected(item)
        }
    }

0

Я зробив це за допомогою цих кроків.

  1. Встановіть заголовок, використовуючи код нижче в onCreateViewголовному фрагменті.
((AppCompatActivity) getActivity()).getSupportActionBar().setTitle("Your title");
  1. Для обміну між фрагментами я використовую нижню панель навігації, яка реалізована на 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;
    }

0

якщо ви використовуєте власну панель інструментів або ActionBar, і ви хочете отримати посилання на панель інструментів / панелі дій з фрагментів, то вам потрібно спочатку отримати екземпляр своєї основної діяльності з методу onCreateView Fragment, як показано нижче.

MainActivity activity = (MainActivity) getActivity();

потім використовуйте активність для подальшої реалізації, як показано нижче

ImageView vRightBtn = activity.toolbar.findViewById(R.id.toolbar_right_btn);

Перш ніж зателефонувати, вам потрібно ініціалізувати власну панель інструментів у вашій MainActivity, як показано нижче.

Перший набір визначає, як на панелі інструментів, як-от публіку

public Toolbar toolbar;
public ActionBar actionBar;

і в методі onCreate () призначте ідентифікаційний користувальницький ідентифікатор панелі

toolbar = findViewById(R.id.custom_toolbar);
setSupportActionBar(toolbar);
actionBar = getSupportActionBar();

Це воно. Він працюватиме у Fragment.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.