从onClick的View对象通知活动

时间:2017-08-23 21:37:57

标签: android android-intent

我似乎遇到了与我的活动类通信的对象的问题。该对象是一个带有onClick方法的视图对象,在调用时,我希望它通知我的活动类,以便它可以执行所述操作。下面是我的情况的一些示例代码(假设已经进行了所有传统的设置操作):

public class MainActivity extends AppCompatActivity{
    //...other global methods and objects
    //Does not have access to instantiated Entry object(s)

    public void entryObjectWasClicked(){
        //perform said action
    } 
}

public class Entry extends View implements View.OnClickListener{
    //...other global methods and objects
    //Does not have access to the MainActivity object

    @Override
    public void onClick(View v){
        //send a message to the MainActivity to 
        //somehow call the entryObjectWasClicked() method
    }
}

我能想到处理这个问题的唯一方法(在我的头脑中)是在MainActivity中创建一个静态方法,然后从一个匿名的MainActivity对象中调用它。 onClick的{​​{1}}方法。静态方法方法的问题在于静态方法中的任何后续方法/对象/原语用法强制那些方法/对象/原语是静态的。这违背了能够拥有Entry对象的两个不同实例的目的。

经过一番观察,我发现使用广播消息,特别是使用MainActivity向活动发送意图。 This code example适用于我的模型,但我想知道:这是我从LocalBroadcastManager对象向MainActivity发送邮件的最佳方式吗?

如果有更有效的方法来做这一切,会是什么?

2 个答案:

答案 0 :(得分:0)

你的事情太复杂了。不要为此重写onClick。相反,让您的活动在视图上调用setOnClickHandler,它设置在单击视图时调用的回调。然后使用默认实现。

答案 1 :(得分:-1)

由于你扩展视图,我想你想在布局中使用它。这意味着你可能想为它创建一个Listener。例如:

public class Entry extends View implements View.OnClickListener{
    private OnClickListener listener;
    public void setListener(OnClickListener listener) {
      this.listener = listener;
    }
    @Override
    public void onClick(){
       if (this.listener != null) this.listener.onClick(this);
    }
}

如何在“活动”中夸大布局并访问自定义视图。

public class MainActivity extends AppCompatActivity{
     public void onCreate( ...) {
       Entry entry = findViewById(R.id.entry);
       entry.setListener(new OnClickListener(...));
     }
}