2015-04-15 2 views
0

В моем приложении у меня есть только одно действие (которое расширяет ActionBarActivity) и различные фрагменты (которые расширяют фрагмент). Когда пользователь нажимает на пункт меню, приложение меняет фрагмент. В этот момент я хочу изменить название и цвет фона ActionBar. Когда я пытаюсь ActionBar actionBar = getActivity().getActionBar(); У меня есть пустое исключение.Как получить доступ к ActionBar из фрагмента на Android

Я использую библиотеку поддержки, и по этой операции я успешно использую android.support.v7.app.ActionBar actionBar = getSupportActionBar();.

На фрагменте:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    view = inflater.inflate(R.layout.material_cadastro, container, false); 

    viewHolder = new MaterialViewHolder(view); 

    ActionBar actionBar = getActivity().getActionBar(); 
    actionBar.setTitle(R.string.inserir_material); 

    return view; 
} 

отладки я получил, что активность возвращается в порядке, но ActionBar равно нулю:

getActivity() = {br.com.americocarelli.vendasfacil.ui.MenuPrinci[email protected]} 
getActivity().getActionBar() = null 
+0

Вы используете библиотеку поддержки? – Josef

+0

У ваших фрагментов есть подходящие идентификаторы или теги? Я считаю, вам нужно установить либо тег, либо ID каждого фрагмента, чтобы getActivity() работал правильно. – BadCash

+0

Отправьте свой код. –

ответ

3

Переопределите onAttach(Activity), затем наберите Activity по номеру ActionBarActivity, вы можете получить ActionBar. Нравится:

@Override 
public void onAttach(Activity activity) { 
    // TODO Auto-generated method stub 
    super.onAttach(activity); 
    ActionBar actionBar=((ActionBarActivity)activity).getSupportActionBar(); 
} 
+0

Спасибо! Я собираюсь переопределить, как вы упоминаете! Мой код был на 'onCreateView' и работал тоже! –

+0

рекомендуется переопределять 'onAttach', потому что' onAttach' вызывается перед 'onCreateView' – SilentKnight

+0

' onCreateView' в основном используется для создания представлений. – SilentKnight

1

Поскольку вы используете поддержки библиотеки (ActionBarActivity), а затем использовать ((ActionBarActivity)getActivity()).getSupportActionBar();, чтобы получить доступ к панели действий поддержки.

+1

Спасибо, человек! Оно работало завораживающе! 'android.support.v7.app.ActionBar actionBar = ((ActionBarActivity) getActivity()). getSupportActionBar();' –

+0

* cast-to * class устарел. Теперь это; '((AppCompatActivity) getActivity()). GetSupportActionBar();' – gnB

0

Возможно, вы построили его с помощью инструментов построения> = 21, что приводит к тому, что actions.getActionBar() возвращает null, вместо этого вы должны использовать getSupportActionBar(). EDIT: если вы получаете NPE именно в этой строке: getActivity(). ... тогда вы, вероятно, ссылаетесь на него до или после того, как фрагмент привязан к активности. Не могли бы вы вставить контекст (место, в какой функции) вы его используете?