1

Ich mache einen Authenticator nach dem Tutorial: http://blog.udinic.com/2013/04/24/write-your-own-android-authenticator/AccountAuthenticatorActivity für AppCompat

Der Login-Aktivität erfordert AccountAuthenticatorActivity zu verlängern, beginnt das Problem hier: AccountAuthenticatorActivity verlängert die regelmäßige Activity und nicht AppCompatActivity.

Die Verwendung des normalen Activity in AppCompat führt zu einem Activity ohne ActionBar. Ich möchte AccountAuthenticatorActivity UND eine ActionBar verwenden.

@SuppressWarnings("unused") 
public class AppCompatAuthActivity extends AccountAuthenticatorActivity { 

    private AppCompatDelegate mDelegate; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     getDelegate().installViewFactory(); 
     getDelegate().onCreate(savedInstanceState); 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    protected void onPostCreate(Bundle savedInstanceState) { 
     super.onPostCreate(savedInstanceState); 
     getDelegate().onPostCreate(savedInstanceState); 
    } 

    public ActionBar getSupportActionBar() { 
     return getDelegate().getSupportActionBar(); 
    } 

    public void setSupportActionBar(@Nullable Toolbar toolbar) { 
     getDelegate().setSupportActionBar(toolbar); 
    } 

    @Override 
    @NonNull 
    public MenuInflater getMenuInflater() { 
     return getDelegate().getMenuInflater(); 
    } 

    @Override 
    public void setContentView(@LayoutRes int layoutResID) { 
     getDelegate().setContentView(layoutResID); 
    } 

    @Override 
    public void setContentView(View view) { 
     getDelegate().setContentView(view); 
    } 

    @Override 
    public void setContentView(View view, ViewGroup.LayoutParams params) { 
     getDelegate().setContentView(view, params); 
    } 

    @Override 
    public void addContentView(View view, ViewGroup.LayoutParams params) { 
     getDelegate().addContentView(view, params); 
    } 

    @Override 
    protected void onPostResume() { 
     super.onPostResume(); 
     getDelegate().onPostResume(); 
    } 

    @Override 
    protected void onTitleChanged(CharSequence title, int color) { 
     super.onTitleChanged(title, color); 
     getDelegate().setTitle(title); 
    } 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
     getDelegate().onConfigurationChanged(newConfig); 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     getDelegate().onStop(); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     getDelegate().onDestroy(); 
    } 

    public void invalidateOptionsMenu() { 
     getDelegate().invalidateOptionsMenu(); 
    } 

    private AppCompatDelegate getDelegate() { 
     if (mDelegate == null) { 
      mDelegate = AppCompatDelegate.create(this, null); 
     } 
     return mDelegate; 
    } 

} 

Die AppCompatDelegate ist der Schlüssel hinzuzufügen ActionBar zu jedem regulären Activity (zB PreferenceActivity):

+0

[use AppCompatDelegate] (https://github.com/SelvinPL/SyncFrameworkAndroid/blob/master/demo/src/main/java/pl/selvin/android/listsyncsample/authenticator/AccountAuthenticatorActivityAppCompat.java) Sie können einfach ableiten Ihre Aktivität von dieser Implementierung und verwenden Sie dann 'getDelegate(). setSupportActionBar()' – Selvin

+0

Link zu Android-Dokumentation für AppCompatDelegate (v7 Support-Bibliothek) https://developer.android.com/reference/android/support/v7/app/AppCompatDelegate .html –

Antwort

6

Der Schlüssel ist AppCompatDelegate, ist mein Code auf der von Android Studio erzeugt AppCompatPreferenceActivity Klasse basiert.

Vergessen Sie nicht, Ihre Aktivität AppCompatAuthActivity verlängern müssen.

+1

Vielen Dank, diese Antwort kann auf 'PreferenceActivity' und andere' Activity' Klassen angewendet werden, die die reguläre 'Activity' Klasse erweitern. –

+0

Oh mein Gott, bitte kopieren Sie den Code genau so, wie er ist. Ich habe es nicht genau kopiert, ich habe 'super.onCreate() 'vor' getDelegate(). OnCreate() 'aufgerufen und es ist ein Fehler aufgetreten, der' onCreateOptionsMenu() 'selbst nach dem Aufruf von' setSupportActionBar nicht aufgerufen hat() '. – Tuby

0

Ich denke, dass nicht die wirkliche Lösung ist. Wenn Sie eine App mit Support-Bibliotheken erstellen, ist das Mischen von AppCompatActivities, Fragmenten & c mit den Standardbibliotheken keine gute Idee.

Ich habe eine AccountAuthenticatorAppCompatActivity Erweiterung AppCompatActivity erstellt und kopieren Sie dann den Code aus API AccountAuthenticatorActivity und es scheint richtig zu funktionieren.

Ich hoffe, es hilft jemandem.