触摸整个Android应用程序的事件

时间:2012-09-25 06:56:38

标签: android

我正在开发一个新的应用程序,我很怀疑它是否可能? 我怀疑是

我们必须为整个应用程序设置一次监听器。我们必须为我们的应用程序中发生的任何触摸事件运行一组代码。 例如。我们的应用中可能有n个活动。但是我们必须为所有活动设置一次监听器,并在任何n个活动中发生任何触摸时运行设置代码。我已经尝试了很多。欢迎任何想法。提前谢谢。

6 个答案:

答案 0 :(得分:3)

我希望我理解你。

你可以做的是创建一个扩展Activity的类,让我们说TouchActivity。 您的每个活动都将继承TouchActivity。

 public class TouchActivity extends Activity 
{
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) 
    {
        if (event.getAction() == MotionEvent.ACTION_DOWN)
        {
            Log.d("Touch", "Touch");
            sendBroadcast(new Intent("touch_event_has_occured"));
        }

        return super.onTouchEvent(event);
    }
}

现在在您的全球广播接收器中,您将获得brodcast

public class TouchReveiver extends BroadcastReceiver 
{

    @Override
    public void onReceive(Context context, Intent intent) 
    {
        if (intent.getAction().equals("touch_event_has_occured"))
        {
            Log.d("Touch", "Touch");
        }
    }

}

不要忘记用动作注册接收器

答案 1 :(得分:2)

您可以创建一个不可见的自定义视图,占用所有屏幕并使用onTouchEvent来执行您需要执行的任何操作。

然后你需要让每个布局文件都在顶部包含该视图(可能在FrameLayout中)。

答案 2 :(得分:0)

您可以做的是,创建一个基本活动类,该类由应用程序中的所有其他活动扩展。然后,您可以覆盖此基本活动中的public boolean dispatchTouchEvent (MotionEvent ev)方法。这个被覆盖的实现将是所有触摸事件落地的单一地方。

但有一个重要的警告,它只会在你的所有活动属于同一类型的情况下起作用(例如 - 所有活动都是Activitiy类型或所有类型都是ListActivity类型)

答案 3 :(得分:0)

完全可能。

创建名为MyTouchActivity(或其他内容)的活动覆盖onTouch事件并编写您正在谈论的set代码。

现在,n活动的所有其余活动应该扩展MyTouchActivity而不是常规活动。这样代码就会继承到所有n个活动。您需要创建单独的MyTouchListActivity(对于ListActivity)和MyTouchMapActivity(对于MapActivity)

另一种方法是简单地创建一个Ontouch LIstener,然后覆盖每个活动中的每个onTocuh事件,首先调用你的Listener。但这很麻烦。

答案 4 :(得分:0)

如果您想在整个应用程序中使用它,则需要创建从ActionBarActivity(或SherlockActivity)扩展的类

public class MyCustomActivity extends ActionBarActivity{

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

        FrameLayout decorView = (FrameLayout) getActivity().getWindow().getDecorView();
        decorView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                Log.d(TAG, "Click X:" + event.getX() + " Y:" + event.getY());
                return false;
            }
        });
    }
}

然后从MyCustomActivity扩展所有其他活动:

public class MainActivity extends MyCustomActivity{ }

所有触摸事件都将通过TouchListener事件

答案 5 :(得分:0)

使用<select class="custom-select"> <option selected="">Open this select menu</option> <option value="1">Banana</option> <option value="2">Watermelon</option> <option value="3">Mango</option> </select> dispatchTouchEvent方法的解决方案不适用于整个应用程序。因为有不同类型的窗户。例如,如果弹出一个片段或用户单击一个菜单,这些解决方案将无法捕获触摸事件,因为在这种情况下,其他情况仍在发生。

长话短说,我正在为我的高级项目处理这个问题,所以我开发了一个库,该库可以收集应用程序的所有触摸事件。该库取决于棘手的方式,但它也可以工作。该库是开源的。您可以根据需要进行检查:https://github.com/fatih-iver/touchy

只需将其添加为依赖项:

onTouch

然后,通过注册您的接收器来使用它:

implementation 'fun.observe:touchy:1.0.0'