【问题标题】:Handling onLongClick of a child view in the Main Activity处理 Main Activity 中子视图的 onLongClick
【发布时间】:2017-11-19 14:28:31
【问题描述】:

我有一个 Main Activity,它有一堆子视图,然后我有一个 ListView,它的项目是动态生成的。我希望能够长按这些项目中的任何一个,并在 Main Activity 中处理此事件。

MainActivity
  LinearLayout
    ListView
      Item - (long click here)

现在我知道如何订阅动态创建的 ListView 项目本身的 onLongClick 事件,但那是在我用来创建项目的适配器中。

我希望的是,我可以简单地订阅 Main Activity 的 onLongClick 事件,然后我会看到动态创建的 ListView 项中的事件传播到 MainActivity。但这并没有发生。

我的 MainActivity 实现了View.OnLongClickListener,就像这样

class MainActivity : Activity(), View.OnLongClickListener {
    override fun onLongClick(v: View?): Boolean {
        Log.d("APP", "LongClicked: ")
        return true
    }
    ......
}

但是,我不确定如何在 Activity 本身中设置处理程序。也就是说,对于 onClick,我会在 Main Activity 的 XML 中设置 android:onClcik="onCLick",但是,我看不到对 onLongClick 执行相同操作的选项 另外,我没有设置任何属性,例如android::longClickable="true/false"

任何观点。我对真/假和实际含义感到有些困惑。

任何帮助将不胜感激。

更新 我尝试在 Main Activity 的 ListView 上调用 setOnLongCLickListener,因为我可以访问那里的 ListView。像这样

availableZonesListView = findViewById(R.id.availableZonesListView)
availableZonesListView!!.onLongClickListener(this)

MainActivity ('this') 实现了 View.OnLongClickListener,当我直接长按 MainActivity/Layout 时,我看到了那里的事件。但是当我长按 ListView 的项目时,我没有看到有事件发生

【问题讨论】:

  • 那么您在适配器的哪个位置调用View#setOnLongClickListener 方法?你也需要它来做某种“上下文菜单”之类的吗?
  • 当我在适配器中设置 onLongClick 侦听器时(在被覆盖的 getView() 方法中),我可以在那里看到事件。但是,我不想在那里做。我宁愿在 MainActivity/Layout 中对它做出反应。希望这有意义吗?在 Main Activity/Layout 中收到事件后,我想调用 MQTT Broker 来做一些事情。
  • 因此,如果您的活动实现了View.OnLongClickListener,那么在您的活动中创建适配器时,只需将this 传递给您的适配器构造函数 - 然后您将能够在@987654333 内部调用setOnLongClickListener 时使用它@方法
  • 适配器正在分配给处理程序中的 ListView。我宁愿不将主要活动传递给处理程序,然后从处理程序传递给适配器。我所期望的是子视图中的事件会自动传播到父母并最终传播到 MainActivity/Layout
  • 处理程序?什么处理程序? android.os.Handler? mybe 发布您的相关代码...

标签: android android-layout listview onlongclicklistener


【解决方案1】:

现在我知道如何订阅动态创建的 ListView 项目本身的 onLongClick 事件,但那是在我用来创建项目的适配器中。

public MainActivity extends .. implements MyClickListener {

 ... onCreate {
     ... =  new MyAdapter(yourParams, this); // `this` is the new param 

 }

  @Override
  public void onAnyItemLongClicked() {
       // Do whatever you want
  }


}

创建您的新界面:

interface MyClickListener {

   void onAnyItemLongClicked();

}

然后在您的适配器中“现在我知道如何订阅 onLongClick 事件”。应该是这样的:

public class MyAdapter {

    // other fields
    private final MyClickListener listener;


    public MyAdapter(otherParams, MyClickListener listener) {
        .. assign other params
        this.listener = listener;
    }

}

// However you set your item click listener (in getView)

adapter.setOnItemLongClickListener(new OnItemLongClickListener() {
     @Override
     public void onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
          listener.onAnyItemLongClicked();
     }
});

这会将点击事件从适配器传播到活动。

(我不得不即兴发挥一点,因为你没有分享很多代码细节)

【讨论】:

  • 我期待/希望的是子视图中的事件会自动传播到父视图并最终到达 MainActivity/Layout。根据您的建议,我必须将对侦听器的引用从 MainActivity 传递到(在我的情况下)到处理程序,然后从处理程序到适配器。我试图避免这样做。
猜你喜欢
  • 1970-01-01
  • 2020-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-09
相关资源
最近更新 更多