74

У меня есть ActionBarActivity с NavigationDrawer и использовать support_v7 Toolbar как ActionBar. На одной из моих панелей инструментов есть пользовательский вид. В других фрагментах Toolbar должен показывать название.Как получить панель инструментов из фрагмента?

Как получить Toolbar экземпляр для настройки из фрагментов? Я могу получить ActionBar с getActivity().getActionBar(), но если я вызываю setTitle() для этого экземпляра ActionBar, он ничего не делает.

UPD:

В моем случае

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

(как сказал MrEngineer13) не работают при создании первого фрагмента, так как я его называю из onHiddenChanged(). Теперь я добавляю больше одного в onCreateView(), и он отлично работает.

+0

фрагменты не имеют actionbars/тулбары деятельность сделать – tyczj

+0

(MainAcivity) this.getActivity()) getToolbar() ; будет правильным ответом !! для получения панели инструментов в фрагменте! –

ответ

147

Необходимо выполнить вашу деятельность от getActivity() до AppCompatActivity. Вот пример:

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

Причина вы должны бросить это потому, что getActivity() возвращает FragmentActivity и вам нужен AppCompatActivity

+7

Получение 'supportActionBar' и 'панель инструментов' - это то же самое? – Darpan

+0

@Darpan да, это работает для меня (панель инструментов) –

+0

@Darpan не уверен –

1

Возможно, вам нужно попробовать getActivity().getSupportActionBar().setTitle(), если вы используете support_v7.

63

В фрагменты случае должны иметь собственный взгляд на 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; 
      } 
     }); 
+2

Пожалуйста, обновите. Теперь вам нужно нажать «AppCompatActivity». – naXa

+1

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

+1

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

6
toolbar = (Toolbar) getView().findViewById(R.id.toolbar); 
AppCompatActivity activity = (AppCompatActivity) getActivity(); 
activity.setSupportActionBar(toolbar); 
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() **, что плохо, потому что это а не как общение между активностью и фрагментом. – Marko

+2

да нет другого способа для этого !! многие из ящиков для навигации реализуют этот стиль только !!! несколько раз нам нужно отбрасывать активность из-за AppCompatActivity (AppCompatActivity) getActivity(), что является еще одной точкой боли !!! все эти вещи полностью убивают время dev :( –

34

У вас есть два варианта, чтобы получить панель инструментов в фрагменте

Первый один

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

и второй один

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

Но это правильный путь .. bcoz у нас есть getSupportedActionBar тоже? –

+0

Действительно превосходно .... – VVB

+0

perfect answerr –

0

Вы можете создать метод для г это на активность класс:

public void setToolbarTitle(String title) { 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    toolbar.setTitle(title); 
} 

И вы можете использовать, как это:.

setToolbarTitle("Hello World");