アクティビティのLayoutInflaterにはすでにFactoryがインストールされているため、AppCompatのAsk Questionをインストールできません。

アクティビティのLayoutInflaterにはすでにFactoryがインストールされているため、AppCompatのAsk Questionをインストールできません。

私はアプリで 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﹕ アクティビティのLayoutInflaterにはすでにFactoryがインストールされているため、AppCompatをインストールできません。

これをどうやって解決すればいいでしょうか?

ベストアンサー1

私の知る限りでは、appcompat 23.1.1 は、によって作成されたダイアログを表示するたびに呼び出されinstallViewFactory()ます。AppCompatDelegateImplV7AlertDialog.Builder

コールスタック:

android.support.v7.app.AppCompatDelegateImplV7.installViewFactory(AppCompatDelegateImplV7.java:970) android.support.v7.app.AppCompatDialog.onCreate(AppCompatDialog.java:58) 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's LayoutInflater already has a Factory installed"
                    + " so we can not install AppCompat's");
        }
    }

ご覧のとおり、ファクトリがすでに設定されている場合は、情報メッセージがログに記録されるだけです。無視しても問題ないように思えますが、ログがいっぱいになると煩わしくなることがあります。

おすすめ記事