使用基于点击侦听器的非活动类调用结果

时间:2012-11-14 09:31:10

标签: android android-intent android-activity android-view

所以,我知道你不应该从非Activity类调用intent,更不用说带有结果的intent了。一个非Activity类不应该这样做,并对它应该做的任何事情负责。

我拥有什么

现在,我有一个NappingActivity,显示了十几个按钮,在VideoButtonView中实现。这些按钮扩展android.widget.Button

我希望能够拖动并单击按钮,因此我通过设置实现了VideoButtonView中的拖动/点击逻辑:

this.setOnTouchListener(new View.OnTouchListener() { … }

当用户点击onTouch(View v, MotionEvent event)内的按钮时,会调用以下内容:

Context context = v.getContext();
Intent showVideo = new Intent(context, ViewActivity.class);
context.startActivity(showVideo);

到目前为止,非常好。

我想要什么

现在,此意图返回NappingActivity,但我想通过返回结果来分离这个视频播放意图。所以,理想情况下,我会从startActivityForResult而不是NappingActivity调用此VideoButtonView,因为后者无论如何都不可能。

问题

  • 我如何重构这个,所以我可以处理活动中的点击而不是按钮,或者至少从那里发送意图?

  • 我应该将整个点击并拖动逻辑移动到活动吗?听起来不太干净。

  • 我可以实现某种自定义侦听器吗?

1 个答案:

答案 0 :(得分:1)

  

我如何重构这个,所以我可以处理点击   在活动内而不是按钮,或至少发送   意图来自那里?

您可以实施回调系统。见第三个答案。

  

我应该将整个点击并拖动逻辑移动到活动吗?没有按'吨   听起来很干净。

不,你正在混合逻辑(但我不明白你如何实施拖拽系统所以我可能错了)。

  

我可以实现某种自定义侦听器吗?

创建界面:

public interface StartVideoListener {
    public void onStartVideoRequest(int buttonId); 
} 

让你的NappingActivity实现此界面:

public class NappingActivity extends Activity implements StartVideoListener {

    // ...
    public void onStartVideoRequest(int buttonId) {
        // you know the button that was clicked, start the desired activity.
    }

VideoButtonView班级中,将Context从构造函数转换为StartVideoListener字段,并在onTouch中调用其方法:

// ...
mListener.onStartVideoRequest(v.getId());