OnTouchEvent () ne sera pas déclenché si setSystemUiVisibility (View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) est invoqué

J'appelle

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) 

Lorsque mon application commence à rendre mon application capable d'afficher l'écran plein.

  • Différentes versions d'Android pour différents environnements
  • Android - change le style de titre de dialogue de toutes les boîtes de dialogue dans l'application
  • GCM (Google Cloud Messaging) n'émet pas d'erreur lors de la désinstallation de l'application
  • Ne fonctionne pas Notifydatasetchange sur RecyclerView avec sélection centrale Scrollview horizontale?
  • Changer la barre d'outils Menu Couleur de l'élément (action non cachée)
  • Traduire et scaler l'animation en parallèle
  • Je souhaite que l'interface utilisateur de mon application s'affiche lorsque l'écran est touché, mais Activity.onTouchEvent() n'est pas déclenché jusqu'à ce que l'écran soit touché une deuxième fois. Au premier contact, seules les clés virtuelles sont affichées.

    Alors, je dois déclencher l'IU de ma application pour faire apparaître

     public void onSystemUiVisibilityChange(int visibility) { if (visibility == View.SYSTEM_UI_FLAG_VISIBLE) { // show my APP UI } } 

    Mais onSystemUiVisibilityChange avec View.SYSTEM_UI_FLAG_VISIBLE sera invoqué NON une fois par contact (3 fois sur mon Galaxy Nexus) par système, surtout si l'utilisateur touche l'écran très rapidement / souvent.

    Projet lib 4.0 ou 4.03. Samsung galaxy (9250) avec 4,03.

    8 Solutions collect form web for “OnTouchEvent () ne sera pas déclenché si setSystemUiVisibility (View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) est invoqué”

    Android 4.4 (API Level 19) présente un nouveau drapeau SYSTEM_UI_FLAG_IMMERSIVE pour setSystemUiVisibility() qui permet à votre application de vraiment "plein écran". Ce drapeau, lorsqu'il est combiné avec les drapeaux SYSTEM_UI_FLAG_HIDE_NAVIGATION et SYSTEM_UI_FLAG_FULLSCREEN , masque les barres de navigation et d'état et permet à votre application de capturer tous les événements tactiles sur l'écran.

    Cela a bien fonctionné pour moi:

      setOnSystemUiVisibilityChangeListener(new OnSystemUiVisibilityChangeListener() { @Override public void onSystemUiVisibilityChange(int visibility) { if ((visibility & SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0) { // show my app UI } } }); 

    Ce que j'ai fait est d'abord importé android.view.GestureDetector afin que je puisse l'utiliser pour détecter des gestes. Android a un certain nombre de gestes par défaut qui sont automatiquement détectés dans la classe GestureDector . La plupart de cette information est trouvée ici , mais ci-dessous est un code dans une forme que j'ai utilisée dans un projet réel qui fonctionne.

    D'abord, j'ai fait une classe anonyme dans mon activité (cela peut être imbriqué n'importe où, mais j'ai tendance à faire mes cours anonymes en bas, juste avant le support de fermeture). REMARQUE: vous pouvez également implémenter OnGestureListener dans le cadre de votre classe, également.

    Le code ci-dessous consiste à utiliser la détection de geste pour donner un simple cache / spectacle.

    J'ai déclaré et défini ma barre d'action (mon UI, initialement cachée) en tant que variable d'instance, afin que je puisse y accéder ici et où que ce soit, mais vous pouvez la remplacer par un getActionBar().show() et getActionBar().hide() dans le cas où vous ne souhaitez pas le déclarer comme une variable d'instance. Remplacez votre UI à la place de l' actionBar ici:

     public class Example extends ActionBarActivity { // declared in onCreate() method private android.support.v7.app.ActionBar actionBar; private GestureDetectorCompat mDetector; private YourView view1; private YourView view2; private YourView view3; private YourView view4; // some other code class GestureListener extends GestureDetector.SimpleOnGestureListener { private static final String DEBUG_TAG = "Gestures in Example Class"; @Override public boolean onDoubleTap(MotionEvent event) { Log.d(DEBUG_TAG, "onDoubleTap: " + event.toString()); // if there is a double tap, show the action bar actionBar.show(); return true; } @Override public boolean onSingleTapConfirmed(MotionEvent event) { Log.d(DEBUG_TAG, "onSingleTapConfirmed: " + event.toString()); // if the tap is below the action bar, hide the action bar if (event.getRawY() > getResources().getDimension(R.dimen.abc_action_bar_default_height)) { actionBar.hide(); return true; } return false; } @Override public boolean onDown(MotionEvent event) { return true; } } // end-of-Example Class 

    Ensuite, dans mon onCreate() j'ai déclaré mon GestureDetector et aussi (optionnellement) mis GestureListeners :

     private GestureDetectorCompat mDetector; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // some code here mDetector = new GestureDetectorCompat(this, new GestureListener()); // this code is for more advanced view logic not needed for a basic set-up //setGestureListeners(); } // end-of-method onCreate() 

    Ensuite, afin d'envoyer des gestes à traiter, nous fournissons les instructions pour faire cela, il y a deux façons dont je sais, d'abord le plus simple:

     /** * This method recognizes a touchEvent and passes it to your custom GestureListener * class. */ @Override public boolean onTouchEvent(MotionEvent event){ this.mDetector.onTouchEvent(event); return super.onTouchEvent(event); } 

    La deuxième façon est plus complexe, mais si vous souhaitez seulement reconnaître les événements tactiles sur certaines View dans votre mise en page, comme dans le cas où vous avez des vues superposées et que vous ne pouvez accéder à la View dessus, vous pouvez créer une classe personnalisée pour passer l'événement Autour ou en haut:

     class MyOnTouchListener implements View.OnTouchListener { public boolean onTouch(View v, MotionEvent event) { if (v.equals(view4)) { return mDetector.onTouchEvent(event); } else return false; } } // end-of-class MyOnTouchListener 

    Et ensuite utilisez-le ici:

     public void setGestureListeners() { /* when we return false for any of these onTouch methods * it means that the the touchEvent is passed onto the next View. * The order in which touchEvents are sent to are in the order they * are declared. */ view1.setOnTouchListener(new MyOnTouchListener()); view2.setOnTouchListener(new MyOnTouchListener()); view3.setOnTouchListener(new MyOnTouchListener()); view4.setOnTouchListener(new MyOnTouchListener()); } // end-of-method setGestureListeners() 

    Dans ma méthode setGestureListeners , je leur ai donné le même ensemble de commandes, qui reconnaît uniquement touchEvents sur view4 . Sinon, il passe le TouchEvent à la vue suivante.

    Il s'agit du code à l'aide d' AppCompat , mais si vous ne construisez pas pour les anciennes versions, vous pouvez utiliser GestureDetector et ActionBar réguliers.

    Avez-vous essayé d'ajouter un code pour afficher seulement votre interface utilisateur lorsque l'état a changé? Vous devez maintenir la dernière visibilité connue et afficher uniquement votre interface utilisateur lorsque vous êtes visible pour la première fois:

     int mLastSystemUiVis; @Override public void onSystemUiVisibilityChange(int visibility) { int diff = mLastSystemUiVis ^ visibility; mLastSystemUiVis = visibility; if ((diff&SYSTEM_UI_FLAG_VISIBLE) != 0 && (visibility&SYSTEM_UI_FLAG_VISIBLE) == 0) { // DISPLAY YOUR UI } } 

    Exemple de code adopté à partir des documents Android

    J'ai également eu ce problème, et j'ai trouvé ceci http://developer.android.com/reference/android/view/View.html#SYSTEM_UI_FLAG_HIDE_NAVIGATION

    Donc, aucun moyen d'aider. Même l'application Gallery installée dans le système Android a utilisé SYSTEM_UI_FLAG_LOW_PROFILE au lieu de SYSTEM_UI_FLAG_HIDE_NAVIGATION en mode page. C'est au moins ce que nous pouvons faire.

    J'ai eu un problème très semblable à tenter de mettre à jour l'interface utilisateur à partir d'un onTouchEvent() exigeant deux touches au travail, et j'ai essayé une foule de choses élaborées avant de finalement faire fonctionner le premier clic.

    Dans mon cas, j'étais en train de montrer un élément précédemment caché, puis j'étais en hauteur, puis je déplaçais un bouton à cette hauteur. Le problème que j'ai rencontré est que la hauteur était de 0 jusqu'à la fin du premier événement tactile. J'ai pu résoudre cela en appelant show () pendant ACTION_UP pour l' onTouchEvent() au lieu de ACTION_DOWN . Peut-être que cela fonctionnerait si vous avez fait quelque chose de similaire?

    Essayez d'utiliser:

    GetWindow (). GetDecorView (). SetSystemUiVisibility (View.GONE);

    au lieu:

    GetWindow (). GetDecorView (). SetSystemUiVisibility (View.SYSTEM_UI_FLAG_HIDE_NAVIGATION)

    Après cela, vous pouvez utiliser l'activité normale en plein écran et, si vous voulez des touches de navigation, vous devez glisser de bas en haut. Travailler pour moi à Galaxy Tab 2 avec Android 4.1.2

    La méthode Activity.onTouchEvent() est appelée à la fin de la chaîne de répondeurs (ce qui signifie que toutes les autres vues ont eu la chance de consommer l'événement). Si vous tapez sur une vue intéressante (c'est-à-dire un Button ou EditText ), vous EditText ne pas voir cet événement.

    Si vous souhaitez avoir accès aux touches avant qu'elles ne soient envoyées sur votre (vos) vue (s), annulez Activity.dispatchTouchEvent() , quelle est la méthode appelée au début de la chaîne d'événements:

     @Override public boolean dispatchTouchEvent(MotionEvent event) { //Check the event and do magic here, such as... if (event.getAction() == MotionEvent.ACTION_DOWN) { } //Be careful not to override the return unless necessary return super.dispatchTouchEvent(event); } 

    Veillez à ne pas remplacer la valeur de retour de cette méthode, sauf si vous désirez volontairement voler des touches du reste des vues, un return true; inutile return true; Dans cet endroit, vous risqueriez de briser une autre manipulation tactile.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.