私はアプリで 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()
ます。AppCompatDelegateImplV7
AlertDialog.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");
}
}
ご覧のとおり、ファクトリがすでに設定されている場合は、情報メッセージがログに記録されるだけです。無視しても問題ないように思えますが、ログがいっぱいになると煩わしくなることがあります。