Пастаянна схаваць панэль навігацыі ў дзейнасці

Ці можна назаўжды выдаліць панэль навігацыі на актыўнасці? Я хачу, каб выдаліць панэль з кнопкамі, якія з'яўляюцца на кнопку экрана на планшэце, а не на панэлі дзеянняў. Тут .

Я ведаю, што гэта не рэкамендуецца рабіць гэта, я не зрабіў гэтае рашэнне, але мне трэба гэта зрабіць. На мой макет, ёсць яшчэ адна кнопка, каб пакінуць актыўнасць. Астатняя частка майго прыкладання можа мець і не мець панэль навігацыі.

Я знайшоў гэты код і адаптаваць яго няшмат. Праблема заключаецца ў тым, што нават калі я схаваць панэль навігацыі, ёсць чорнае прастору засталося ззаду. Я мяркую, што сістэма вылічае памер экрана, які мае пад увагу панэль навігацыі?

public static class Content extends ImageView implements View.OnSystemUiVisibilityChangeListener, View.OnClickListener, ActionBar.OnMenuVisibilityListener {
    Activity mActivity;
    TextView mTitleView;
    Button mPlayButton;
    SeekBar mSeekView;
    boolean mAddedMenuListener;
    boolean mMenusOpen;
    boolean mPaused;
    boolean mNavVisible;
    int mLastSystemUiVis;

    Runnable mNavHider = new Runnable() {
        @Override public void run() {
            setNavVisibility(false);
        }
    };

    public Content(Context context, AttributeSet attrs) {
        super(context, attrs);
        setOnSystemUiVisibilityChangeListener(this);
        setOnClickListener(this);
    }

    public void init(Activity activity, TextView title, Button playButton,
            SeekBar seek) {
       //This called by the containing activity to supply the surrounding
       //state of the video player that it will interact with.
        mActivity = activity;
        mTitleView = title;
        mPlayButton = playButton;
        mSeekView = seek;
        mPlayButton.setOnClickListener(this);
        setPlayPaused(true);
    }

    @Override protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        if (mActivity != null) {
            mAddedMenuListener = true;
            mActivity.getActionBar().addOnMenuVisibilityListener(this);
        }
    }

    @Override protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        if (mAddedMenuListener) {
            mActivity.getActionBar().removeOnMenuVisibilityListener(this);
        }
    }

    @Override public void onSystemUiVisibilityChange(int visibility) {
       //Detect when we go out of nav-hidden mode, to clear our state
       //back to having the full UI chrome up.  Only do this when
       //the state is changing and nav is no longer hidden.
        int diff = mLastSystemUiVis ^ visibility;
        mLastSystemUiVis = visibility;
        if ((diff&SYSTEM_UI_FLAG_HIDE_NAVIGATION) != 0
                && (visibility&SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0) {
            setNavVisibility(true);
        }
    }

    @Override protected void onWindowVisibilityChanged(int visibility) {
        super.onWindowVisibilityChanged(visibility);

       //When we become visible or invisible, play is paused.
        setPlayPaused(true);
    }

    @Override public void onClick(View v) {
        if (v == mPlayButton) {
           //Clicking on the play/pause button toggles its state.
            setPlayPaused(!mPaused);
        } else {
           //Clicking elsewhere makes the navigation visible.
            setNavVisibility(true);
        }
    }

    @Override public void onMenuVisibilityChanged(boolean isVisible) {
        mMenusOpen = isVisible;
        setNavVisibility(true);
    }

    void setPlayPaused(boolean paused) {
        mPaused = paused;
        mPlayButton.setText(paused ? R.string.play : R.string.pause);
        setKeepScreenOn(!paused);
        setNavVisibility(true);
    }

    void setNavVisibility(boolean visible) {
        int newVis = SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                | SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                | SYSTEM_UI_FLAG_LAYOUT_STABLE;
        if (!visible) {
            newVis |= SYSTEM_UI_FLAG_LOW_PROFILE | SYSTEM_UI_FLAG_FULLSCREEN
                    | SYSTEM_UI_FLAG_HIDE_NAVIGATION;
        }

       //If we are now visible, schedule a timer for us to go invisible.
        if (visible) {
            Handler h = getHandler();
            if (h != null) {
                h.removeCallbacks(mNavHider);
                if (!mMenusOpen && !mPaused) {
                   //If the menus are open or play is paused, we will not auto-hide.
                    h.postDelayed(mNavHider, 1500);
                }
            }
        }

       //Set the new desired visibility.
        setSystemUiVisibility(newVis);
        mTitleView.setVisibility(visible ? VISIBLE : INVISIBLE);
        mPlayButton.setVisibility(visible ? VISIBLE : INVISIBLE);
        mSeekView.setVisibility(visible ? VISIBLE : INVISIBLE);
    }

}
28
Як вы выкарыстоўваеце гэты код?
дададзена аўтар Shajeel Afzal, крыніца

9 адказы

There is a solution starting with KitKat (4.4.2), called Immersive Mode: https://developer.android.com/training/system-ui/immersive.html

У прынцыпе, вы павінны дадаць гэты код у ваш метад onResume ():

View decorView = getWindow().getDecorView();
decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                              | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                              | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                              | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                              | View.SYSTEM_UI_FLAG_FULLSCREEN
                              | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
60
дададзена
Гэта не з'яўляецца сталым. так што гэта не права, як прынята адказваць.
дададзена аўтар Vahid Ghadiri, крыніца
павінен быць прыняты адказ
дададзена аўтар Jaysbays, крыніца

<�Моцны> Вы можаце

Ёсць Два шляху (як патрабуе каранёвага прылады):

1- First way, open the device in adb window command, and then run the following:

 adb shell >
 su >
 pm disable com.android.systemui >

і атрымаць яго назад толькі зрабіць тое ж самае, але змяніць адключыць у ўключыць .

2- second way, add the following line to the end of your device's build.prop file :

qemu.hw.mainkeys = 1

то, каб атрымаць яго назад проста выдаліць яго.

і калі вы не ведаеце, як змяніць <�моцны> <�моцны /> файл build.prop:

  • EsExplorer на прыладзе і пошук build.prop затым змяніць яго дазволу на чытанне і запіс, нарэшце, дадайце радок.
  • загрузіць спецыялізаваны дадатак рэдактар ​​build.prop як build.propEditor .
  • або звярніцеся да гэтай спасылцы .
21
дададзена
@meditat ды гэта правільна, і патрабуе корань, я буду правіць мой адказ accordingely
дададзена аўтар Muhammed Refaat, крыніца
каб схаваць яго, вы можаце часова, каб схаваць яго назаўсёды, вы павінны быць выкаранены
дададзена аўтар Muhammed Refaat, крыніца
@Innocent Я рады, што змог дапамагчы :)
дададзена аўтар Muhammed Refaat, крыніца
@ShajeelAfzal націсніце Меню на левым баку, а затым уключыце «Root Explorer», для поўнага кіраўніцтва глядзіце ў спасылку
дададзена аўтар Muhammed Refaat, крыніца
@naveedahmad Дзякуй і дабро запрашаем :)
дададзена аўтар Muhammed Refaat, крыніца
@JohnyTex ды гэта бяспечна, так як гэта мае справу толькі з UI не асноўны сістэмы, а таксама аб праграмуемых кнопак навігацыі яны не будуць нават існаваць зусім, так як яны ў асноўным існуюць у панэлі навігацыі
дададзена аўтар Muhammed Refaat, крыніца
@JohnyTex com.android.systemui выкарыстоўваецца для адключэння некаторых функцый карыстацкага інтэрфейсу, дададзеных у сістэму, як і шпалеры навігацыйных панэляў. І калі гаворка ідзе пра qemu.hw.mainkeys = 1, што вы маеце на ўвазе пад «прыладамі з кнопкамі праграмнага забеспячэння»?
дададзена аўтар Muhammed Refaat, крыніца
працаваў як шарм
дададзена аўтар Naveed Ahmad, крыніца
Гэта павінна быць абраным адказ, я дадам больш практычнасці да гэтага ансу пазней
дададзена аўтар Naveed Ahmad, крыніца
Але гэта патрабуе прылады, каб быць выкаранены. Я шукаю рашэнне для некорневых прылад.
дададзена аўтар Shajeel Afzal, крыніца
Я не мог знайсці build.prop файл, выкарыстоўваючы EsExplorer
дададзена аўтар Shajeel Afzal, крыніца
Вялікі дзякуй
дададзена аўтар Innocent, крыніца
OK тнх. Ці бяспечна адключыць com.android.systemui тады? Ці можна разбіць прылада пры пэўных канкрэтных абставінах? .... Я казаў пра мяккіх кнопках навігацыі; не які-небудзь асаблівы APK мяккай кнопкі прыкладанняў або што-небудзь падобнае.
дададзена аўтар JohnyTex, крыніца
Вы ведаеце, калі qemu.hw.mainkeys = 1 будзе працаваць на ўсіх прыладах з кнопкамі праграмнага забеспячэння існуе?
дададзена аўтар JohnyTex, крыніца
Вы ведаеце, якія менавіта функцыянальнасць com.android.systemui мае?
дададзена аўтар JohnyTex, крыніца
Другі метад таксама патрабуе каранёвага дазволу.
дададзена аўтар meditat, крыніца

Вы можаце схаваць панэль навігацыі, проста выклічце гэты метад на ваш OnCreate() ,

 public void FullScreencall() {
    if(Build.VERSION.SDK_INT < 19){ 
        View v = this.getWindow().getDecorView();
        v.setSystemUiVisibility(View.GONE);
    } else {
            //for higher api versions.    
        View decorView = getWindow().getDecorView(); 
        int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
        decorView.setSystemUiVisibility(uiOptions);
    }
}

Гэта схавае ўсю nagiation panel.hope гэта дапаможа вам

12
дададзена
Прывітанне, ва ўсякім выпадку, каб схаваць кнопкі пасля ўводу фокусу ў WebView, які выяўляецца ключавым словам?
дададзена аўтар Patrick, крыніца
Это не навсегда!
дададзена аўтар Vahid Ghadiri, крыніца
Памылка друку? Каментар павінен сказаць,//для вышэйшага API,
дададзена аўтар user1010160, крыніца

AFAIK, гэта немагчыма без каранёвага доступу. Было б праблема бяспекі, каб быць у стане мець прыкладанне, якое не можа быць перапынена з дапамогай кнопак сістэмы.

Edit, see here: Hide System Bar in Tablets

5
дададзена

Змена тэмы ў маніфесце.

Калі вы хочаце схаваць навігацыйную панэль для аднаго віду дзейнасці, вы можаце выкарыстоўваць гэта:


Калі вы хочаце схаваць навігацыйную панэль для ўсяго прыкладання вы можаце выкарыстоўваць гэта:


4
дададзена
Я хацеў бы, каб выдаліць панэль навігацыі, а не бар дзеянні. Я хачу, каб схаваць кнопкі, якія з'яўляюцца ў ніжняй частцы экрана для планшэтаў.
дададзена аўтар steve_patrick, крыніца
прывітанне Стыў, ёсць некаторыя праблемы чытання неразумення з гэтымі адказамі. кожны хоча, каб вы, каб выдаліць панэль дзеянняў. LOL. Вы калі-небудзь зразумець гэта для версіі 4.0 і вышэй? дзякуй
дададзена аўтар steveh, крыніца

Пасля прагляду DevBytes відэа (Раман Нурык) і чытаць самую апошнюю радок у дакументацыі , у якім гаворыцца:

<�Р> Заўвага: Калі вам падабаецца паводзіны аўта-утойванне IMMERSIVE_STICKY, але трэба, каб паказаць свае ўласныя элементы кіравання карыстацкага інтэрфейсу, а таксама, проста выкарыстоўваць Immersive ў спалучэнні з Handler.postDelayed() ці нешта падобнае, каб зноў увайсці ў рэжым апускання праз некалькі секунд. </р>

адказ, radu122 даў, працаваў для мяне. Проста наладзіць апрацоўшчык і ваш будзе добра ісці.

Вось код, які працуе для мяне:

@Override
protected void onResume() {
    super.onResume();
    executeDelayed();
}


private void executeDelayed() {
    Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
           //execute after 500ms
            hideNavBar();
        }
    }, 500);
}


private void hideNavBar() {
    if (Build.VERSION.SDK_INT >= 19) {
        View v = getWindow().getDecorView();
        v.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                                | View.SYSTEM_UI_FLAG_FULLSCREEN
                                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
    }
}

Google кажа, што «праз некалькі секунд», - але я хачу, каб забяспечыць гэтую функцыянальнасць як мага хутчэй. Можа быць, я змяню значэнне пазней, калі ў мяне ёсць, я буду абнаўляць гэты адказ.

2
дададзена
Хм, імхо платформы даволі добра і вельмі добра дакументаваны. Але некаторыя асаблівасці цяжка і/або непрыгожа ажыццявіць, вы маеце рацыю.
дададзена аўтар Martin Pfeffer, крыніца
Я з вамі. Можа быць, платформа забяспечвае лепшае рашэнне прама цяпер.
дададзена аўтар Martin Pfeffer, крыніца
Ну гэта самы жудасны спосаб зрабіць, але Google рэкамендуецца выкарыстоўваць у такім спосабе .. Няўжо яны не могуць забяспечыць добры спосаб зрабіць гэта? які Idiocracy
дададзена аўтар Android Developer, крыніца
Я баюся, не ... Я зараз спрабую знайсці, але не так ... проста Google смокча вялікі час на прадастаўленне сапраўды карысныя APIs
дададзена аўтар Android Developer, крыніца

Спачатку хаваецца ў OnResume() дзейнасці, то таксама трымаць укрыўнасці, як паказана ніжэй:

decorView.setOnSystemUiVisibilityChangeListener
                (new View.OnSystemUiVisibilityChangeListener() {
                    @Override
                    public void onSystemUiVisibilityChange(int visibility) {
                       //Note that system bars will only be "visible" if none of the
                       //LOW_PROFILE, HIDE_NAVIGATION, or FULLSCREEN flags are set.
                        if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
                            //visible
                            hideSystemUI();
                        } 
                    }
                    }
                });`

    public void hideSystemUI() {
       //Set the IMMERSIVE flag.
       //Set the content to appear under the system bars so that the content
       //doesn't resize when the system bars hide and show.
        decorView.setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION//hide nav bar
                        | View.SYSTEM_UI_FLAG_FULLSCREEN//hide status bar
                        | View.SYSTEM_UI_FLAG_IMMERSIVE);
    }
2
дададзена

З дакументацыі Google:

Вы можаце схаваць панэль навігацыі Android 4.0 і вышэй, выкарыстоўваючы сцяг SYSTEM_UI_FLAG_HIDE_NAVIGATION. Гэты фрагмент кода хавае як панэль навігацыі і радок стану:

View decorView = getWindow().getDecorView();
// Hide both the navigation bar and the status bar.
// SYSTEM_UI_FLAG_FULLSCREEN is only available on Android 4.1 and higher, but as
// a general rule, you should design your app to hide the status bar whenever you
// hide the navigation bar.
int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
              | View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);

http://developer.android.com/training/system-ui/navigation.html

0
дададзена
Гэта не з'яўляецца сталым.
дададзена аўтар Vahid Ghadiri, крыніца

Маё рашэнне, каб толькі схаваць панэль навігацыі, з'яўляецца:

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

    final View decorView = getWindow().getDecorView();
    decorView.setOnSystemUiVisibilityChangeListener (new View.OnSystemUiVisibilityChangeListener() {
        @Override
        public void onSystemUiVisibilityChange(int visibility) {
            if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
                decorView.setSystemUiVisibility(
                        View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
            }
        }
    });
}

@Override
protected void onResume() {
    super.onResume();
    final int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
    final View decorView = getWindow().getDecorView();
    decorView.setSystemUiVisibility(uiOptions);
}
0
дададзена
дзе вы атрымаеце GetWindow() ? У маім канцы ён кажа: ** Немагчыма прачытаць сімвал GetWindow() **.
дададзена аўтар Website Is Fun, крыніца