30

電話する

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

私のアプリが私のアプリを全画面表示できるようにするとき。

画面がタッチされたときにアプリの UI がポップアップするようにしたいのですがActivity.onTouchEvent()、画面が 2 回目にタッチされるまでトリガーされません。最初のタッチでは、仮想キーのみが表示されます。

そのため、アプリの UI をトリガーしてポップアップする必要があります。

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

ただしonSystemUiVisibilityChangeView.SYSTEM_UI_FLAG_VISIBLE特にユーザーが画面を非常に速く/頻繁にタッチする場合は、システムによってタッチごとに1回(私のGalaxy Nexusでは3回)呼び出されません。

プロジェクト lib 4.0 または 4.03。Samsung Galaxy(9250) 4.03.

4

8 に答える 8

8

Android 4.4 (API レベル 19)では、アプリを真の「全画面表示」にするための新しいSYSTEM_UI_FLAG_IMMERSIVEフラグが導入されています。このフラグをおよびフラグsetSystemUiVisibility()と組み合わせると、ナビゲーション バーとステータス バーが非表示になり、アプリで画面上のすべてのタッチ イベントをキャプチャできるようになります。SYSTEM_UI_FLAG_HIDE_NAVIGATIONSYSTEM_UI_FLAG_FULLSCREEN

于 2016-07-30T13:51:02.367 に答える
0

状態が変化したときにのみ UI を表示するコードを追加しようとしましたか? 最後の既知の可視性を維持し、最初に可視化されたときにのみ UI を表示する必要があります。

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
    }
}

Android ドキュメントから採用されたコード サンプル

于 2012-07-08T01:26:04.717 に答える
0

2回のタッチが必要なUIを更新しようとすると、非常によく似た問題がonTouchEvent()発生し、最初のクリックで最終的に動作するようになる前に、多くの精巧なものを試しました.

私の場合、以前に非表示にしたアイテムを表示し、その高さを取得してから、その高さだけボタンを下に移動していました。私が遭遇した問題は、最初のタッチ イベントが終了するまで、高さが 0 として表示されていたことです。の代わりにACTION_UPfor の間に show() を呼び出すことで、これを解決できました。似たようなことをしたらうまくいくかも?onTouchEvent()ACTION_DOWN

于 2013-05-16T03:10:38.700 に答える
0

私もこの問題を抱えていて、これを見つけましたhttp://developer.android.com/reference/android/view/View.html#SYSTEM_UI_FLAG_HIDE_NAVIGATION

だから、助ける方法はありません。Android システム パッケージ化されたギャラリー アプリでさえ、フォト ページ ビューで SYSTEM_UI_FLAG_HIDE_NAVIGATION の代わりに SYSTEM_UI_FLAG_LOW_PROFILE を使用していました。これが少なくとも私たちにできることです。

于 2012-12-04T13:16:49.650 に答える
0

このメソッドは、レスポンダー チェーンの最後(つまり、他のすべてのビューがイベントを消費する機会があった後) にActivity.onTouchEvent()呼び出されます。タッチに関心のあるビュー (つまり aまたは) をタップすると、Activity でそのイベントが表示されない可能性が高くなります。ButtonEditText

すべてのタッチがビューにディスパッチされる前にタッチにアクセスしたい場合Activity.dispatchTouchEvent()は、代わりにオーバーライドします。これは、イベント チェーンの最初に呼び出されるメソッドです。

@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);
}

残りのビューから意図的にタッチを盗もうとしない限り、このメソッドの戻り値をオーバーライドしないように注意してくださいreturn true;。この場所に不要なものがあると、他のタッチ処理が中断されます。

于 2012-07-27T20:13:18.883 に答える