Intereting Posts
Приложение для голосового вызова приложения, например, Viber & Line in android Получение координат представления относительно корневого макета Андроидальная камера: Ошибка выдачи результата ResultInfo {who = null, request = 0, result = -1, data = null} к активности Android: событие сенсорного экрана через ADB Android: Как заставить обновление всех виджетов определенного типа Как использовать квалификатор 2 @Named от Dagger в Котлине Это приложение или используемая им библиотека использует NSQuickDrawView, который устарел. Приложения должны прекратить использование QuickDraw и перейти к Quartz API распознавания звука, SDK (Android) Захват моментального снимка Relative layout с прозрачным фоном дает растровое изображение с черным фоном, не прозрачным Gradle исключает плагин в основном проекте для определенных подпроектов (ов) NetBeans с NBAndroid – не может найти символ setContentView (R.layout.main); Как добавить кнопку на экран предпочтения? Android Dex: невозможно выполнить DX (IntelliJ) Операторы RxJava Настройка фильтра на основе пользовательских данных

.getSupportActionBar недоступен в Fragment; Обходной путь приводит к NullPointerException при вращении

Состав

(Изменились названия Activies / Fragments)

Основываясь на некоторых советах, написанных в Android Programming: The Big Nerd Ranch Guide , у меня есть следующая структура:

  • MyListFragment extends ListFragment
  • MyListActivity extends SimpleFragmentActivity
  • SimpleFragmentActivity extends ActionBarActivity

MyListActivity.java

 public class MyListActivity extends SingleFragmentActivity { @Override protected Fragment createFragment() { return new MyListFragment(); } } 

SingleFragmentActivity.java

 public abstract class SingleFragmentActivity extends ActionBarActivity { protected abstract Fragment createFragment (); @Override public void onCreate (Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_fragment); FragmentManager fm = getSupportFragmentManager(); Fragment fragment = fm.findFragmentById(R.id.fragmentContainer); if (fragment == null) { fragment = createFragment(); fm.beginTransaction().add(R.id.fragmentContainer, fragment).commit(); } } } 

После того, как вы описали и запрограммировали основные функции моего приложения (включая панель контекстного действия, навигация, …), я хотел убедиться, что приложение как можно более назад совместимо, без дополнительных усилий. Поэтому я начал использовать ActionCompat (com.android.support:appcompat-v7:20+) ActionBar.

То, что сбивало меня с толку вначале, было тем, что противоречило каждому учебнику или рекомендациям разработчиков Android, которые я читал, – метод getSupportActionBar никогда не был доступен в Android Studio (я использую Android Studio v0.8.2 и JRE 1.7_60). Всякий раз, когда я getActivity().getSup , единственными предложениями, которые я получаю, являются getSupportFragmentManager и getSupportLoaderManager .

В качестве обходного пути я создаю переменную-член ActionBar mActionBar в MyListFragment и инициализирую его:

 @Override public void onAttach (Activity activity) { super.onAttach(activity); mActionBar = ((ActionBarActivity) activity).getSupportActionBar(); } 

Казалось, что это трюк на Android 4.4.4 (Moto G) и 2.3.4 (LG E-510) – единственные устройства, которые у меня есть.

Однако, придя к проблеме, у меня есть поворот, назначение ActionBar теряется, и приложение выходит из строя с помощью исключения NullPointerException. Отладка приложения и установка точки останова в следующей строке в onCreate :

 mActionBar.setTitle(R.string.title_activity_my_list); 

Я узнал, что mActionBar является нулевым после вращения. Размещение этой строки в onCreateView не помогло.

Что я пробовал

  • Размещение инициализации mActionBar в
    • onAttach
    • onActivityCreated
    • onCreate / onCreateView прямо перед вызовом .setTitle

У меня здесь нет идей и благодарны за советы.

EDIT-0 (30.07.)

Исключение выбрасывается (после редактирования согласно предложению Алекса )

 07-30 15:05:25.239 5049-5049/MYAPPNAME E/AndroidRuntime﹕ [Blue Error Handler] Make Debugging Report file for main java.lang.RuntimeException: Unable to start activity ComponentInfo{MYAPPNAME/MYAPPNAME.MYLISTACTIVITY}: java.lang.NullPointerException at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1653) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1669) at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:2838) at android.app.ActivityThread.access$1600(ActivityThread.java:117) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:130) at android.app.ActivityThread.main(ActivityThread.java:3737) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:507) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:894) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:652) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.NullPointerException at MYAPPNAME.MYLISTFRAGMENT.onCreate(MYLISTFRAGMENT.java:54) at android.support.v4.app.Fragment.performCreate(Fragment.java:1481) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:908) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1121) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1103) at android.support.v4.app.FragmentManagerImpl.dispatchCreate(FragmentManager.java:1896) at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:216) at android.support.v7.app.ActionBarActivity.onCreate(ActionBarActivity.java:98) at MYAPPNAME.SingleFragmentActivity.onCreate(SingleFragmentActivity.java:22) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1617) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1669) at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:2838) at android.app.ActivityThread.access$1600(ActivityThread.java:117) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:130) at android.app.ActivityThread.main(ActivityThread.java:3737) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:507) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:894) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:652) at dalvik.system.NativeStart.main(Native Method) 

MyListFragment line 54 (исключение происходило с использованием SingleFragmentActivity и ActionBarActivity в качестве трансляции)

 ((SingleFragmentActivity) getActivity()).getSupportActionBar().setTitle(R.string .title_activity_my_list); 

Линии SingleFragmentActivity 20-22:

 @Override public void onCreate (Bundle savedInstanceState) { super.onCreate(savedInstanceState); 

Solutions Collecting From Web of ".getSupportActionBar недоступен в Fragment; Обходной путь приводит к NullPointerException при вращении"

getActivity() свой getActivity() в ActionBarActivity / AppCompatActivity (в зависимости от того, что вы используете), и у вас будет доступ к поддержке ActionBar .

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

или

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

Используйте этот код в onActivityCreated(...) вместо onAttach(...)

Теперь это должно быть:

 ((AppCompatActivity)getActivity()).setSupportActionBar(); 

Потому что ActionBarActivity устарела.

Но это только если вы должны сделать это за пределами деятельности, где это чаще всего делается.

Хотя ответы на них даются очень поздно, это может помочь кому-то. Мы можем напрямую вызвать следующий код
((AppCompatActivity)getActivity()).getSupportActionBar().setTitle("String");
Он также отлично работает.