30

我打电话

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

当我的应用程序开始使我的应用程序能够显示全屏时。

我希望我的应用程序的用户界面在触摸屏幕时弹出,但Activity.onTouchEvent()在第二次触摸屏幕之前不会触发。第一次触摸时,仅显示虚拟键。

所以,我必须触发我的应用程序的 UI 才能弹出

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

onSystemUiVisibilityChangewithView.SYSTEM_UI_FLAG_VISIBLE不会被系统每次触摸调用一次(在我的 Galaxy Nexus 上 3 次),尤其是当用户非常快速/经常触摸屏幕时。

项目库 4.0 或 4.03。三星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 回答
1

This did work for me:

 setOnSystemUiVisibilityChangeListener(new OnSystemUiVisibilityChangeListener() {
        @Override
        public void onSystemUiVisibilityChange(int visibility) {
            if ((visibility & SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0) {
                // show my app UI
            }
        }
    });
于 2014-01-25T14:52:00.800 回答
1

我所做的是首先导入android.view.GestureDetector,所以我可以用它来检测手势。Android 有许多在GestureDector 类中自动检测的默认手势。大部分信息都可以在这里找到,但下面是我在实际项目中使用的代码形式。

首先,我在我的活动中创建了一个匿名类(它可以嵌套在任何地方,但我倾向于将匿名类放在底部,就在右括号之前)。注意:您也可以OnGestureListener将其作为类的一部分来实现。

下面的代码用于使用手势检测来提供简单的隐藏/显示。

我已将我的操作栏(我的 UI,最初是隐藏的)声明并定义为实例变量,因此我可以在此处以及其他任何地方访问它,但您可以将其替换为 agetActionBar().show()getActionBar().hide()在您不想要的情况下将其声明为实例变量。用你的 UI 代替actionBar这里:

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

然后在我onCreate()的声明中,我GestureDetector还(可选)设置了我的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()

然后,为了实际发送要处理的手势,我们提供了执行此操作的说明,我知道有两种方法,首先是最简单的:

/**
* 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);
}

第二种方法更复杂,但是如果您只想识别View布局中某些 s 上的触摸事件,例如在您有重叠视图并且只能访问 top 的情况下View,您可以创建一个自定义类来传递事件或向上:

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

然后在这里使用它:

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()

在我的setGestureListeners方法中,我给了他们所有相同的命令集,基本上只识别 touchEvents on view4。否则,它只是将 touchEvent 传递给下一个视图。

这是使用 的代码AppCompat,但如果您不是为旧版本构建,您可以使用常规的GestureDetectorand ActionBar

于 2015-02-12T08:01:15.327 回答
0

尝试使用:

getWindow().getDecorView().setSystemUiVisibility(View.GONE);

反而:

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

之后,您可以在全屏模式下使用正常活动,如果您需要导航键,则需要从下向上滑动。使用 android 4.1.2 在 Galaxy Tab 2 为我工作

于 2013-11-05T21:25:24.570 回答
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 回答
0

我也遇到了这个问题,我发现了这个http://developer.android.com/reference/android/view/View.html#SYSTEM_UI_FLAG_HIDE_NAVIGATION

所以,没办法帮忙。甚至 android 系统打包的 Gallery 应用程序在照片页面视图中使用 SYSTEM_UI_FLAG_LOW_PROFILE 而不是 SYSTEM_UI_FLAG_HIDE_NAVIGATION。这至少是我们能做的。

于 2012-12-04T13:16:49.650 回答
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

我有一个非常相似的问题,试图从onTouchEvent()需要两次触摸才能工作来更新 UI,我尝试了一堆精心制作的东西,然后终于让它在第一次点击时工作。

在我的例子中,我展示了一个以前隐藏的项目,然后获取它的高度,然后将一个按钮向下移动该高度。我遇到的问题是高度显示为 0 直到第一次触摸事件完成之后。我能够通过在ACTION_UPfor the期间调用 show()onTouchEvent()而不是它来解决这个问题ACTION_DOWN。如果你做类似的事情,也许它会起作用?

于 2013-05-16T03:10:38.700 回答