J'utilise une barre d'outils comme barre d'action dans une activité. J'essaie d'ajouter la méthode getActionBar().setDisplayHomeAsUpEnabled(true);
au fichier Activity.Java pour la navigation vers le haut pour les appareils plus anciens.
La méthode génère le message d'erreur suivant dans Android Studio:
L'appel de méthode peut produire une exception Java.lang.NullPointerException
La navigation vers le haut de la barre d’outils fonctionne bien sur les appareils plus récents ... maintenant, je cherche à savoir comment s’assurer que cela fonctionnera pour les appareils plus anciens . Veuillez conseiller.
De build.gradle:
dependencies {
compile "com.Android.support:appcompat-v7:22.1.0"
}
De AndroidManifest.xml:
Android:theme="@style/Theme.AppCompat.NoActionBar.FullScreen"
De styles.xml
<style name="Theme.AppCompat.NoActionBar.FullScreen" parent="AppTheme">
<item name="Android:windowNoTitle">true</item>
<item name="windowActionBar">false</item>
<item name="Android:windowFullscreen">true</item>
de Activity.Java
public class CardViewActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.cardviewinput);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
if (toolbar != null) {
// Up navigation to the parent activity for 4.0 and earlier
getActionBar().setDisplayHomeAsUpEnabled(true);
toolbar.setNavigationIcon(R.drawable.ic_action_previous_item);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
}
}
En réalité, Android Studio ne vous affiche pas un "message d'erreur", c'est juste un avertissement.
Certaines réponses suggèrent l'utilisation d'une assertion, le runtime de Dalvik a assertion désactivé par défaut, vous devez donc l'activer pour qu'il puisse réellement faire quelque chose. Dans ce cas (l'assertion est désactivée), ce que vous faites est essentiellement de tromper Android Studio pour ne pas vous montrer l'avertissement. De plus, je préfère ne pas utiliser "assert" dans le code de production.
À mon avis, ce que vous devriez faire est très simple.
if(getActionBar() != null){
getActionBar().setDisplayHomeAsUpEnabled(true);
}
Update: Si vous utilisez la version de la barre de tâches de la bibliothèque d'assistance, remplacez getActionBar () par getSupportActionBar ().
if(getSupportActionBar() != null){
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
Tout d'abord, vous devez définir la barre d'outils en tant que support ActionBar . Ensuite, si vous êtes certain qu'il y sera tout le temps, déclarez-le simplement comme! = Null. Cela indiquera au compilateur qu'il ne sera pas nul, ainsi la vérification de zéro passe.
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.cardviewinput);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
assert getSupportActionBar() != null;
getSupportActionBar().setDisplayHomeAsUpEnabled(true); // it's getSupportActionBar() if you're using AppCompatActivity, not getActionBar()
}
Merci Andrew pour votre réponse ... Si vous avez un tiroir de navigation ou autre chose qui utilise getSupportActionBar (), vous devez ajouter assert getSupportActionBar ()! = Null;
Paix,
Exemple:
@Override
public void setTitle(CharSequence title) {
mTitle = title;
assert getSupportActionBar() != null;
getSupportActionBar().setTitle(mTitle);
}
Essaye ça :
private ActionBar getActionBar() {
return ((AppCompatActivity) getActivity()).getSupportActionBar();
}
Ce que j'ai fait est de remplacer la méthode getSupportActionBar()
dans mon activité de base et d'ajouter une annotation @NonNull
. Ainsi, dans l'activité de base, je ne reçois qu'un seul avertissement de peluchage sur la façon dont j'utilise l'annotation @NonNull
pour quelque chose qui a une annotation @Nullable
.
@NonNull
@Override
public ActionBar getSupportActionBar() {
// Small hack here so that Lint does not warn me in every single activity about null
// action bar
return super.getSupportActionBar();
}
ajouter assert getSupportActionBar() != null;
avant getSupportActionBar().setDisplayHomeAsUpEnabled(true);
J'ai créé une classe générique telle que:
public final class Cast
{
private Cast() {}
/**
* Helps to eliminate annoying NullPointerException lint warning.
*/
@Android.support.annotation.NonNull
public static <T> T neverNull(T value)
{
return value;
}
}
alors je peux l'utiliser pour tout appel avec l'avertissement NullPointerException pour lequel je suis sûr que cela n'arrivera jamais, par exemple.
final ActionBar actionBar = Cast.neverNull(getSupportActionBar());
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);
P.S. N'oubliez pas d'ajouter "com.Android.support:support-annotations" à votre fichier Gradle.
if(actionBar != null) {
actionBar.setHomeButtonEnabled(true);
actionBar.setBackgroundDrawable(ContextCompat.getDrawable(mContext,
R.drawable.action_bar_gradient));
}
Si vous importez
Android.app.ActionBar
vous devez utiliser getActionBar ()
et si vous importez
Android.support.v7.app.ActionBar
utilisez getSupportActionBar ()
utiliser ce thème: Android:theme="@style/Theme.AppCompat.Light.NoActionBar"
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setTitle("Title");
setSupportActionBar(toolbar);
ActionBar actionBar = getSupportActionBar();
actionBar.setHomeButtonEnabled(true);
actionBar.setHomeAsUpIndicator(R.drawable.ic_action_previous_item);
actionBar.setDisplayHomeAsUpEnabled(true);
if(getSupportActionBar() != null){
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
OR
Remplacez le MainActivity extends AppCompatActivity
par le public class MainActivity extends AppCompatActivity
Essaye ça :
setSupportActionBar (toolbar);
if(getSupportActionBar () != null) {
assert getSupportActionBar () != null;
getSupportActionBar ().setDisplayHomeUpEnabled(true);
}
Notez que setSupportActionBar (barre d'outils) doit être avant getSupportActionBar ().
il suffit de vérifier getSupportActionBar différent de null
setSupportActionBar(toolbar);
if(getSupportActionBar() != null) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setTitle("Daily Shopping List");
}
Vous pouvez également asserter la barre d’action pour ne pas avoir la valeur NULL.Ajoutez l’assertion avant d’appeler votre barre d’action comme suit
assert getSupportActionBar() != null;
L'extrait final ressemblerait donc à ce qui suit:
setSupportActionBar((Toolbar) findViewById(R.id.toolbar));
assert getSupportActionBar() != null;
getSupportActionBar().setDisplayHomeAsUpEnabled(true);