Подтвердить что ты не робот

В LayoutInflater активности уже установлен Factory, поэтому мы не можем установить AppCompat

Я использую библиотеку AppCompat (com.android.support: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: в макете активности Inflater уже установлен Factory, поэтому мы не можем установить

AppCompat <

Как это решить?

4b9b3361

Ответ 1

В этом случае вы должны использовать тематический контекст, т.е. вместо

новый AlertDialog.Builder(getActivity());

вам нужно сделать

new AlertDialog.Builder(getSupportActionBar().getThemedContext());

Кроме того, вам также нужно следить за родительской темой и подсказкой windowActionBar, приведенной здесь - support.v7.app.AlertDialog выдает NullPointerException при увольнении

Ответ 2

Из того, что я могу сказать, appcompat 23.1.1 вызывает installViewFactory() в AppCompatDelegateImplV7 каждый раз, когда вы показываете диалог, созданный AlertDialog.Builder.

Стек вызовов:

в android.support.v7.app.AppCompatDelegateImplV7.installViewFactory(AppCompatDelegateImplV7.java:970) в android.support.v7.app.AppCompatDialog.onCreate(AppCompatDialog.java:58) at android.support.v7.app.AlertDialog.onCreate(AlertDialog.java:239) в android.app.Dialog.dispatchOnCreate(Dialog.java:361) в android.app.Dialog.show(Dialog.java:262) в android.support.v7.app.AlertDialog $Builder.show(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 LayoutInflater already has a Factory installed"
                    + " so we can not install AppCompat's");
        }
    }

Как вы можете видеть, как только factory уже установлен, он просто регистрирует информационное сообщение. Кажется довольно безопасным игнорировать, но он может раздражать, когда он заполняет ваши журналы.

Ответ 3

Решение. Ошибка. "В LayoutInflater активности уже установлен Factory, поэтому мы не можем установить AppCompat" также может быть из-за неправильного кода. В моем случае код дважды вызывал "super.onCreate(savedInstanceState)" (ошибка кода), и как только дублированный вызов был удален, ошибка была решена.

Это мой журнал ошибок:

02-29 04:54:40.706 4417-4417/com.projects.ajay.example2 I/AppCompatDelegate: The Activity 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.access$800(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.access$800(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

Ответ 4

Изменить

inflater.inflate(R.layout.dialog_filter_inventory,null);

к

inflater.inflate(R.layout.dialog_filter_inventory,null,false);

В случае раздувания диалогового окна мы не хотим, чтобы он прикреплялся к указанной группе ViewGroup (== null).

Это может помочь.

Вторая попытка

Информационный журнал вызывается следующим кодом в AppCompatDelegateImplV7:

@Override
public void installViewFactory() {
    LayoutInflater layoutInflater = LayoutInflater.from(mContext);
    if (layoutInflater.getFactory() == null) {
        LayoutInflaterCompat.setFactory(layoutInflater, this);
    } else {
        Log.i(TAG, "The Activity LayoutInflater already has a Factory installed"
                + " so we can not install AppCompat's");
    }
}

Возможно, вы установили Factory раньше, чем раньше в вашем коде?