【问题标题】:Android: Attaching multiple click listeners to Button?Android:将多个点击侦听器附加到按钮?
【发布时间】:2020-08-02 22:10:41
【问题描述】:

当我正在创建一个库时,我想使用该库(一种分析点击跟踪库)跟踪来自应用程序的按钮点击。所以我尝试了很多东西,但这些都对我不起作用。我浏览了下面的链接,我知道我们可以使用复合模式添加多个侦听器。

Attaching multiple listeners to views in android?

请帮助我实现我的要求。

这是我尝试过的代码

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_fragment_demo);

    final FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
    fragmentTransaction.replace(R.id.frameFragment, new FragmentA());
    fragmentTransaction.commit();

    Button button = findViewById(R.id.buttonDemo);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.e("test", "Button Click 1");
        }
    });

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.e("test", "Button Click 2");
            /*Field field = null;
            try {
                Log.e("test", "CLASS NAME: "+v.getClass().getName());
                field = Class.forName(v.getClass().getName()).getDeclaredField("mOnClickListener");
                View.OnClickListener retrievedListener = (View.OnClickListener) field.get(v);
                Log.e("test", ""+retrievedListener.toString());
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
                Log.e("test", "Exception: NoSuchFieldException");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
                Log.e("test", "Exception: ClassNotFoundException");
            } catch (IllegalAccessException e) {
                e.printStackTrace();
                Log.e("test", "Exception: IllegalAccessException");
            }*/


            ClickListener listenerCollector = new ClickListener();
            listenerCollector.addOnclickListener(this);
        }
    });



}

}

另一个类

public class ClickListener implements View.OnClickListener {
private ArrayList<View.OnClickListener> clickListeners = new ArrayList<>();

public void addOnclickListener(View.OnClickListener listener){
    clickListeners.add(listener);
}
@Override
public void onClick(View v) {
    for(View.OnClickListener l : clickListeners){
        l.onClick(v);
        Log.e("test", "onclick from composite click");
    }
}

}

【问题讨论】:

  • 如果你能补充一点,你想要达到的目标再多一点,就会很容易提供帮助。
  • @Suresh 你也可以发布你的代码吗?
  • 这个链接能回答你的问题吗? stackoverflow.com/questions/5465204/…
  • @Keshav1234,我已经浏览了上面的链接,我不清楚。
  • @Suresh 好的,请发布您从其他资源中尝试和理解的代码。

标签: android android-layout android-fragments android-button


【解决方案1】:

试试这个方法:

MainActivityonCreate 和另一个类的onCreate 中添加以下内容:

Clicklistener 类设为singleton,以便它随时包含单个对象。

ClickListener listenerCollector = new ClickListener.getInstance();
listenerCollector.addOnclickListener(this);

MainActivity 的按钮的onClick 中添加以下内容:

for (ClickListener listener: listenerCollector.clickListeners){
      listener.onClick();
}

删除 ClickListener OnClick 方法中的 for 循环。

希望这会有所帮助。

【讨论】:

  • 我想在我的 Android 库类(即不是活动类)中跟踪这个点击监听器。它会起作用吗?
  • 图书馆可以有活动。你可以通过实现它来构建一个模块并使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-11
  • 1970-01-01
  • 2011-12-02
  • 1970-01-01
  • 1970-01-01
  • 2011-08-21
  • 2011-11-27
相关资源
最近更新 更多