LayoutInflater деятельности уже имеет установленную фабрику, поэтому мы не можем установить AppCompat
Я использую библиотеку AppCompat (com.андроид.поддержка: appcompat-v7: 22.1.0) в моем приложении. Я создал ActionBar во фрагменте. Когда я нажимаю в пункте меню, он показывает диалоговое окно предупреждения. Вот мой код:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection
switch (item.getItemId()) {
case R.id.action_new:
showFilterDialog();
return true;
case R.id.action_send:
new sendInventoryTask().execute();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
и мой метод showInventoryDialog:
private void showFilterInventoryDialog() {
AlertDialog.Builder alert = new AlertDialog.Builder(getActivity());
LayoutInflater inflater= getActivity().getLayoutInflater();
View v = inflater.inflate(R.layout.dialog_filter_inventory,null);
alert.setView(v);
alert.setTitle(getResources().getString(R.string.filters));
alert.setPositiveButton(getResources().getString(R.string.filter), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// TODO
}
});
alert.setNegativeButton(getResources().getString(R.string.cancel), null);
alert.show();
}
все работает нормально, но когда я нажимаю на пункт меню, чтение logcat показывает мне ошибку:
I / AppCompatDelegate﹕ LayoutInflater деятельности уже имеет установленную фабрику поэтому мы можем не установить совместимости приложений
Как это решить?
4 ответов
вы должны использовать тематический контекст в этом случае, т. е. вместо
новый AlertDialog.Builder (getActivity ());
вам нужно
new AlertDialog.Builder(getSupportActionBar().getThemedContext());
кроме того, вам также нужно следовать родительской теме и подсказке windowActionBar, приведенной здесь -поддержка.В7.приложение.AlertDialog бросает исключение NullPointerException на увольнение
из того, что я могу сказать, appcompat 23.1.1 вызывает installViewFactory()
на AppCompatDelegateImplV7
каждый раз, когда вы показываете диалоговое окно создается AlertDialog.Builder
.
Стек Вызовов:
at андроид.поддержка.В7.приложение.AppCompatDelegateImplV7.installViewFactory (AppCompatDelegateImplV7.java: 970) на андроид.поддержка.В7.приложение.AppCompatDialog.onCreate (AppCompatDialog.java: 58) на Андроид.поддержка.В7.приложение.AlertDialog.onCreate (AlertDialog.java: 239) на Андроид.приложение.Диалог.dispatchOnCreate (Диалог.java: 361) на андроид.приложение.Диалог.показать (диалог.java: 262) at андроид.поддержка.В7.приложение.AlertDialog$Builder.шоу(AlertDialog.java: 902)
@Override
public void installViewFactory() {
LayoutInflater layoutInflater = LayoutInflater.from(mContext);
if (layoutInflater.getFactory() == null) {
LayoutInflaterCompat.setFactory(layoutInflater, this);
} else {
Log.i(TAG, "The Activity's LayoutInflater already has a Factory installed"
+ " so we can not install AppCompat's");
}
}
как вы можете видеть, как только завод уже установлен, он просто регистрирует информационное сообщение. Кажется довольно безопасным игнорировать, но это может раздражать, когда он заполняет ваши журналы.
решение-ошибка "LayoutInflater активности уже установлена на заводе, поэтому мы не можем установить AppCompat" также может быть вызвана неправильным кодом. В моем случае код назывался "супер".onCreate (savedInstanceState)" дважды (ошибка кода), и как только дубликат вызова был удален, ошибка была решена.
Это мой журнал ошибок:
02-29 04:54:40.706 4417-4417/com.projects.ajay.example2 I/AppCompatDelegate: The Activity's LayoutInflater already has a Factory installed so we can not install AppCompat's
02-29 04:54:40.709 4417-4417/? D/AndroidRuntime: Shutting down VM
02-29 04:54:40.715 4417-4417/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.projects.ajay.example2, PID: 4417
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.projects.ajay.example2/com.projects.ajay.example2.MainActivity}: java.lang.IllegalStateException: Already attached
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2331)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2393)
at android.app.ActivityThread.access0(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1309)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5351)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)
Caused by: java.lang.IllegalStateException: Already attached
at android.support.v4.app.FragmentManagerImpl.attachController(FragmentManager.java:2025)
at android.support.v4.app.FragmentController.attachHost(FragmentController.java:95)
at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:276)
at android.support.v7.app.AppCompatActivity.onCreate(AppCompatActivity.java:61)
at com.projects.ajay.example2.MainActivity.onCreate(MainActivity.java:24)
at android.app.Activity.performCreate(Activity.java:6020)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2284)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2393)
at android.app.ActivityThread.access0(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1309)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5351)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)
02-29 04:54:40.727 4417-4417/? I/Process: Sending signal. PID: 4417 SIG: 9
изменить
inflater.inflate(R.layout.dialog_filter_inventory,null);
до
inflater.inflate(R.layout.dialog_filter_inventory,null,false);
в случае раздувания диалога мы не хотим, чтобы он присоединялся к указанной ViewGroup (== null).
это может помочь.
вторая попытка
info-log выбрасывается следующим кодом в AppCompatDelegateImplV7
:
@Override
public void installViewFactory() {
LayoutInflater layoutInflater = LayoutInflater.from(mContext);
if (layoutInflater.getFactory() == null) {
LayoutInflaterCompat.setFactory(layoutInflater, this);
} else {
Log.i(TAG, "The Activity's LayoutInflater already has a Factory installed"
+ " so we can not install AppCompat's");
}
}
может быть, вы установили фабрику раньше в своем коде?