10
votes

Activité de l'assistant d'activité complet. Comment arrêter la barre d'action de montrer quand j'interagie avec le périphérique?

Lorsque je crée une activité à l'aide du Assistant d'activité Fullscreen A> Il crée une activité en plein écran, mais chaque fois que je clique n'importe où sur l'écran, la barre d'action indique pendant quelques secondes. Comment puis-je arrêter de le faire?

Code complet de FullScreenactivity.java strong> p>

/**
 * An example full-screen activity that shows and hides the system UI (i.e.
 * status bar and navigation/system bar) with user interaction.
 * 
 * @see SystemUiHider
 */
public class FullscreenActivity extends Activity {
    /**
     * Whether or not the system UI should be auto-hidden after
     * {@link #AUTO_HIDE_DELAY_MILLIS} milliseconds.
     */
    private static final boolean AUTO_HIDE = true;

    /**
     * If {@link #AUTO_HIDE} is set, the number of milliseconds to wait after
     * user interaction before hiding the system UI.
     */
    private static final int AUTO_HIDE_DELAY_MILLIS = 3000;

    /**
     * If set, will toggle the system UI visibility upon interaction. Otherwise,
     * will show the system UI visibility upon interaction.
     */
    private static final boolean TOGGLE_ON_CLICK = true;

    /**
     * The flags to pass to {@link SystemUiHider#getInstance}.
     */
    private static final int HIDER_FLAGS = SystemUiHider.FLAG_HIDE_NAVIGATION;

    /**
     * The instance of the {@link SystemUiHider} for this activity.
     */
    private SystemUiHider mSystemUiHider;

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

        setContentView(R.layout.activity_fullscreen);

        final View controlsView = findViewById(R.id.fullscreen_content_controls);
        final View contentView = findViewById(R.id.fullscreen_content);

        // Set up an instance of SystemUiHider to control the system UI for
        // this activity.
        mSystemUiHider = SystemUiHider.getInstance(this, contentView,
                HIDER_FLAGS);
        mSystemUiHider.setup();
        mSystemUiHider
                .setOnVisibilityChangeListener(new SystemUiHider.OnVisibilityChangeListener() {
                    // Cached values.
                    int mControlsHeight;
                    int mShortAnimTime;

                    @Override
                    @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
                    public void onVisibilityChange(boolean visible) {
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
                            // If the ViewPropertyAnimator API is available
                            // (Honeycomb MR2 and later), use it to animate the
                            // in-layout UI controls at the bottom of the
                            // screen.
                            if (mControlsHeight == 0) {
                                mControlsHeight = controlsView.getHeight();
                            }
                            if (mShortAnimTime == 0) {
                                mShortAnimTime = getResources().getInteger(
                                        android.R.integer.config_shortAnimTime);
                            }
                            controlsView
                                    .animate()
                                    .translationY(visible ? 0 : mControlsHeight)
                                    .setDuration(mShortAnimTime);
                        } else {
                            // If the ViewPropertyAnimator APIs aren't
                            // available, simply show or hide the in-layout UI
                            // controls.
                            controlsView.setVisibility(visible ? View.VISIBLE
                                    : View.GONE);
                        }

                        if (visible && AUTO_HIDE) {
                            // Schedule a hide().
                            delayedHide(AUTO_HIDE_DELAY_MILLIS);
                        }
                    }
                });

        // Set up the user interaction to manually show or hide the system UI.
        contentView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (TOGGLE_ON_CLICK) {
                    mSystemUiHider.toggle();
                } else {
                    mSystemUiHider.show();
                }
            }
        });

        // Upon interacting with UI controls, delay any scheduled hide()
        // operations to prevent the jarring behavior of controls going away
        // while interacting with the UI.
        findViewById(R.id.dummy_button).setOnTouchListener(
                mDelayHideTouchListener);
    }

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

        // Trigger the initial hide() shortly after the activity has been
        // created, to briefly hint to the user that UI controls
        // are available.
        delayedHide(100);
    }

    /**
     * Touch listener to use for in-layout UI controls to delay hiding the
     * system UI. This is to prevent the jarring behavior of controls going away
     * while interacting with activity UI.
     */
    View.OnTouchListener mDelayHideTouchListener = new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            if (AUTO_HIDE) {
                delayedHide(AUTO_HIDE_DELAY_MILLIS);
            }
            return false;
        }
    };

    Handler mHideHandler = new Handler();
    Runnable mHideRunnable = new Runnable() {
        @Override
        public void run() {
            mSystemUiHider.hide();
        }
    };

    /**
     * Schedules a call to hide() in [delay] milliseconds, canceling any
     * previously scheduled calls.
     */
    private void delayedHide(int delayMillis) {
        mHideHandler.removeCallbacks(mHideRunnable);
        mHideHandler.postDelayed(mHideRunnable, delayMillis);
    }
}


0 commentaires

8 Réponses :


1
votes

J'ai pris une photo profonde dans le code et j'ai commencé l'activité sur un périphérique Android 4.2 sans boutons de navigation physique. La configuration par défaut est aussi complète que possible. Il cache barre d'état forte>, barre d'action forte> et bar de navigation forte>. Alors, comment l'utilisateur serait-il censé sortir de votre activité sinon avec un clic n'importe où sur l'écran? Tout le reste serait très restreint et mauvaise convivialité. Je pense que c'est la raison pour laquelle ce comportement ne peut pas être manipulé.

Ce que vous pouvez faire à la place, change le systemuihider code> de sorte qu'il masque la barre d'état et la barre d'action, mais pas fort> la barre de navigation. Il pose plutôt la barre de navigation à trois points pâles, voir la capture d'écran ci-dessous. P>

bar de navigation dimmé p>

Il doit y avoir une meilleure façon de y parvenir, mais les travaux suivants. Commentaire Ces lignes à la fin du SystemuiHiderhoneyComb () Code> Constructeur: P>

// Set up the user interaction to manually show or hide the system UI.
contentView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        if (TOGGLE_ON_CLICK) {
            mSystemUiHider.toggle();
        } else {
            mSystemUiHider.show();
        }
    }
});


5 commentaires

Cela ne fonctionne pas, le système réinitialise automatiquement la barre d'action lors de l'interaction. Le code ci-dessus ne vous permet que de masquer l'interface utilisateur lorsque son visible, de sorte que mysemuihider.show (); une partie est à peu près redondante. Je cherche également un moyen de remplacer ce comportement.


Merci pour votre réponse. Je vais essayer si je cherche toujours une solution qui inclut la barre de navigation. Si vous avez utilisé l'application Kindle, vous comprendrez pourquoi cela serait utile. Dans cette application, vous pouvez afficher la navigation en cliquant sur le centre de l'écran, mais cliquant sur une page ou en cliquant à gauche ou à droite de l'écran n'a aucun effet. Réapparaissant la barre de navigation lors du cliquant une page est non seulement gênante, cela vous oblige également à fléchir deux fois, car le premier clic est consommé par l'action qui déclenche cet effet. Cela doit être possible depuis que Kindle le fait.


@Jaypea Kindle exécute une version modifiée d'Android avec des modifications apportées aux bibliothèques principales, donc je ne les pointerais pas pour leur preuve. Cela dit, il est probablement est possible.


@yarian oui mais je veux dire l'application Android Kindle, pas l'appareil. En outre, il y a une application appelée Aldiko qui a également cette fonctionnalité.


@Jaypea ah d'accord, je ne le savais pas.



0
votes

Changer le thème de votre activité pour ne pas avoir une barre d'action. Le mieux est d'hériter d'une activité d'action Sherlock et de retirer la barre d'action


1 commentaires

Le problème est que cela cacherait la barre d'action de manière permanente. Je ne sais pas sur l'Op, mais dans mon cas, je cherche temporairement la barre d'action temporairement, puis le montrer à nouveau manuellement quand une certaine condition est remplie (pas seulement sur une interaction utilisateur, car elle travaille actuellement)



12
votes

Si je comprends correctement, vous voulez simplement masquer la barre d'action?

Si oui, changez cette ligne (modifier le flag_hide_navigation vers 0). P>

getActionBar().show();


1 commentaires

Merci, je devrai encore savoir comment intégrer cela avec l'animation, mais cela empêche la barre d'action de réapparaître lors de l'interaction comme nécessaire.



2
votes

J'ai essayé de la même chose en mettant 0 à la place de 3000 xxx

mais sa devenir trop laggy ... Donc, le truc u d'apporter des modifications dans androidmanifest.xml Ajouter xxx

à androidmanifest.xml sous-équipement


0 commentaires

2
votes

Cela a fonctionné pour moi. Bien que le navigateur ne soit complètement supprimé, il ne permet pas beaucoup de temps à l'utilisateur d'interagir, plus les icônes de boutons sont de petits points. De plus, cela réduit la quantité de code nécessaire auparavant pour créer un écran plein écran.

SystemUiHider hider = null;

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

    //go full screen with no title
    this.requestWindowFeature(Window.FEATURE_PROGRESS); //show progress on loadup
    this.requestWindowFeature(Window.FEATURE_NO_TITLE); //hide the title bar
    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); //go fullscreen

    setContentView(R.layout.activity_main);

    //hide the navigation controls
    final RelativeLayout mainLayout = (RelativeLayout)this.findViewById(R.id.mainLayout);
    hider = SystemUiHider.getInstance(this, mainLayout, SystemUiHider.FLAG_HIDE_NAVIGATION);
    hider.setup();
    hider.setOnVisibilityChangeListener(new SystemUiHider.OnVisibilityChangeListener() {
        @Override
        @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
        public void onVisibilityChange(boolean visible) {
            if (visible) {
                //will make navigator into small dots
                hider.hide(); 

                //must use delayed to force navigator to disappear completely
                final Handler mHideHandler = new Handler();
                final Runnable mHideRunnable = new Runnable() {
                    @Override
                    public void run() {
                        hider.hide();
                    }
                };
                mHideHandler.removeCallbacks(mHideRunnable);
                mHideHandler.postDelayed(mHideRunnable, 1000); //min 1 sec to work
            }
        }
    });
    hider.hide();

    //do the rest of your onCreate stuff here
}


1 commentaires

Merci pour le truc postdelayed , j'étais tellement frustré par la gradation semi-aléatoire, lorsque la navigation était censée être cachée.



1
votes

dans API19, nous pouvons utiliser:

getWindow().getDecorView()
    .setSystemUiVisibility(View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                           | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION); 


0 commentaires

0
votes

Bien que c'est trop tard pour poster une réponse, mais aussi loin que je peux comprendre la question et que je travaille à l'aide du modèle d'activité complet fourni dans Android Studio code>, je pense que la réponse à cette La question est de désactiver la barre d'action qui devient visible lorsque l'utilisateur interagit avec l'interface utilisateur, qui peut être obtenue simplement en désactivant le onclicklistener code> sur contentView code> I.e.

contentView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        if (TOGGLE_ON_CLICK) {
            mSystemUiHider.toggle();
        } else {
            mSystemUiHider.show();
        }
    }
});


0 commentaires

0
votes

Il suffit de commenter xxx pré>

par défaut, l'état est éteint. Basculer survient car il y a un auditeur onclick ajouté également qui bascule l'écran. Vous pouvez simplement ne pas l'ajouter et supprimer le code de code. P>

Le code le plus récent est // Configurez l'interaction de l'utilisateur pour afficher ou masquer manuellement l'interface utilisateur système. P>

mContentView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
           // toggle();
        }


0 commentaires