Je rajoute un petit TextView
en bas de mon application lorsque l'application est hors ligne. Donc j'ai un BroadcastReceiver
qui surveille les changements de connectivité réseau et dans la méthode onReceive
, j'affiche la bannière. Voici la classe de la bannière qui ajoute le TextView
au-dessus de la vue existante :
public static void show() {
if (!isShowing && !isAppBackgrounded()) {
MyApplication app = MyApplication.getInstance();
WindowManager windowManager = (WindowManager) app.getSystemService(Context.WINDOW_SERVICE);
Resources res = app.getResources();
TextView offlineTv = app.getOfflineTv();
if (offlineTv.getWindowToken() != null) {
return;
}
offlineTv.setText("Hors ligne");
offlineTv.setTextColor(ContextCompat.getColor(app, R.color.yellow));
offlineTv.setGravity(Gravity.CENTER);
offlineTv.setBackgroundColor(ContextCompat.getColor(app, R.color.dark_grey));
offlineTv.setTextSize(TypedValue.COMPLEX_UNIT_SP, app.getResources().getInteger(R.integer.offline_banner_text_size));
WindowManager.LayoutParams params = createLayoutParams(WindowManager.LayoutParams.TYPE_TOAST, null);
windowManager.addView(offlineTv, params);
isShowing = true;
}
}
Voici la méthode createLayoutParams
private static WindowManager.LayoutParams createLayoutParams(int type, @Nullable IBinder windowToken) {
WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
layoutParams.format = PixelFormat.TRANSLUCENT;
layoutParams.width = WindowManager.LayoutParams.MATCH_PARENT;
layoutParams.height = 25;
layoutParams.gravity = GravityCompat.getAbsoluteGravity(Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM, ViewCompat.LAYOUT_DIRECTION_LTR);
layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
layoutParams.type = type;
layoutParams.token = windowToken;
layoutParams.windowAnimations = android.R.style.Animation_Toast;
return layoutParams;
}
Ce code fonctionne correctement sur tous les appareils sauf sur les appareils 7.1.1. Sur les appareils 7.1.1, le TextView
s'affiche pendant un moment puis disparaît. Il y a juste un espace blanc vide à la place du TextView
sur les appareils 7.1.1. Avez-vous une idée de pourquoi cela se produit ?
MODIFICATION : comme demandé dans les commentaires, voici comment j'obtiens le TextView : il s'agit de la classe MyApplication étendant Application :
TextView offlineTv = null;
/** Obtenir le TextView pour afficher le message hors ligne */
public TextView getOfflineTv() {
if (offlineTv == null) {
offlineTv = new TextView(this);
}
return offlineTv;
}
/** Effacer le TextView hors ligne une fois que nous avons fini de le montrer */
public void clearOfflineTv() {
if (offlineTv != null) {
offlineTv = null;
}
}
Et voici mon BroadcastReceiver, où je montre / cache le TextView :
public class DSConnectionChangeReceiver extends BroadcastReceiver {
/**
* Callback de changement de connexion
* @param context Contexte
* @param intent Intention
*/
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = cm.getActiveNetworkInfo();
boolean connected = false;
boolean isCellularData = false;
if (activeNetworkInfo != null) {
connected = activeNetworkInfo.isAvailable() && activeNetworkInfo.isConnected();
int type = activeNetworkInfo.getType();
isCellularData = (type == ConnectivityManager.TYPE_MOBILE) || (type == ConnectivityManager.TYPE_MOBILE_DUN);
}
if (connected) {
if (OfflineBanner.isShowing()) {
OfflineBanner.dismiss();
}
} else {
OfflineBanner.show();
}
}
}