2015-07-28 7 views
26

Używam biblioteki AppCompat (com.android.support:appcompat-v7:22.1.0) w mojej aplikacji. Stworzyłem ActionBar w fragmencie. Kiedy klikam w pozycję menu, pokazuje się okno alarmowe. Tu jest mój kodu:Na LayoutInflater działania jest już zainstalowana Fabryka, więc nie możemy zainstalować AppCompat's

@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); 
    } 
} 

I moja metoda 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(); 
} 

Wszystko działa poprawnie, ale po kliknięciu na pozycja menu, logcat pokazuje mi błąd:

I/AppCompatDelegate﹕ The Activity's LayoutInflater already has a Factory installed so we can not install AppCompat's

Jak rozwiązać ten problem?

+0

Co klasa jest przedłużony o swojej klasie aktywności? –

+0

MainActivity rozszerza AppCompatActivity – aseolin

Odpowiedz

5

Jesteś zobowiązany do korzystania z tematycznych kontekst, w tym przypadku, to znaczy zamiast

new AlertDialog.Builder(getActivity());

trzeba zrobić

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

Poza tym, trzeba także śledzić tematu nadrzędnego i napiwków windowActionBar tutaj - support.v7.app.AlertDialog throws NullPointerException on dismiss

+7

Nie działa to z najnowszą aplikacją AppCompat na urządzeniach L lub M. – Philio

+1

Nie miało to żadnego efektu, nadal otrzymuję komunikat logcat. – k2col

-1

Zmień

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

do

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

W przypadku pompowania Dialog, nie chcemy go dołączyć do określonej ViewGroup (== null).

To może pomóc.

drugie spróbować

INFO-log jest wyrzucane przez następujący kod w 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"); 
    } 
} 

Może to być zainstalowany Factory somewere wcześniej w kodzie?

+0

Wprowadziłem zmianę, ale wciąż ta sama – aseolin

+1

Czy używasz wersji standardowej lub wersji V7 AlertDialog? –

+0

Importuję plik android.support.v7.app.AlertDialog – aseolin

6

Z tego co wiem, appcompat 23.1.1 dzwoni installViewFactory() w AppCompatDelegateImplV7 za każdym razem, gdy wyświetlasz okno dialogowe utworzone przez AlertDialog.Builder.

stosu wywołań:

at android.support.v7.app.AppCompatDelegateImplV7.installViewFactory(AppCompatDelegateImplV7.java:970) at android.support.v7.app.AppCompatDialog.onCreate(AppCompatDialog.java:58) at android.support.v7.app.AlertDialog.onCreate(AlertDialog.java:239) at android.app.Dialog.dispatchOnCreate(Dialog.java:361) at android.app.Dialog.show(Dialog.java:262) at 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"); 
     } 
    } 

Jak widać, gdy jest już fabrycznie ustawione po prostu loguje się komunikat informacyjny. Zignorowanie tego może wydawać się całkiem bezpieczne, ale może być denerwujące, gdy zapełnia logi.

0

Rozwiązanie - Błąd "LayoutInflater działania ma już zainstalowany Factory, więc nie możemy zainstalować AppCompat" może być również z powodu niepoprawnego kodu. W moim przypadku kod wywoływał dwukrotnie "super.onCreate (savedInstanceState)" (błąd kodu) i po usunięciu zduplikowanego połączenia błąd został rozwiązany.

To jest mój dziennik błędów:

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.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