1

AppCompat Je fais un authentificateur suivant le tutoriel: http://blog.udinic.com/2013/04/24/write-your-own-android-authenticator/AccountAuthenticatorActivity pour

L'activité de connexion nécessite d'étendre AccountAuthenticatorActivity, la question commence ici: AccountAuthenticatorActivity étend la Activity régulière et non AppCompatActivity.

Utilisation de la Activity régulière dans les résultats appcompat dans un Activity sans ActionBar. Je veux utiliser AccountAuthenticatorActivity ET ayant un ActionBar.

+0

[utilisez AppCompatDelegate] (https://github.com/SelvinPL/SyncFrameworkAndroid/blob/master/demo/src/main/java/pl/selvin/android/listsyncsample/authenticator/AccountAuthenticatorActivityAppCompat.java) vous pouvez simplement en dériver votre activité à partir de cette implémentation, puis utilisez 'getDelegate(). setSupportActionBar()' – Selvin

+0

lien vers les documents Android pour AppCompatDelegate (bibliothèque de support v7) https://developer.android.com/reference/android/support/v7/app/AppCompatDelegate .html –

Répondre

6

La clé est AppCompatDelegate, mon code est basé sur la classe AppCompatPreferenceActivity générée par Android Studio:

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

} 

Le AppCompatDelegate est la clé d'ajouter ActionBar à TOUTE Activity régulière (par exemple PreferenceActivity).

N'oubliez pas que votre activité doit s'étendre AppCompatAuthActivity.

+1

Merci beaucoup, cette réponse peut être appliquée à 'PreferenceActivity' et à d'autres classes' Activity' qui étendent la classe régulière 'Activity'. –

+0

Oh mon dieu, s'il vous plaît copiez ce code exactement comme il est. Je ne l'ai pas copié exactement, j'ai invoqué 'super.onCreate()' avant 'getDelegate(). OnCreate()' et il en est résulté un bogue qui a causé 'onCreateOptionsMenu()' de ne pas être appelé même après avoir appelé 'setSupportActionBar() '. – Tuby

0

Je pense que ce n'est pas la vraie solution. Si vous faites une application avec des bibliothèques de support, en mélangeant AppCompatActivities, Fragments & c avec les standards n'est pas une bonne idée.

J'ai créé un AccountAuthenticatorAppCompatActivity en étendant AppCompatActivity puis en copiant/collant le code de l'API AccountAuthenticatorActivity et il semble fonctionner correctement.

J'espère que ça aide quelqu'un.