0

所以,我知道你不应该从非 Activity 类中调用意图,更不用说带有结果的意图了。一个非 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,因为后者无论如何都是不可能的。

问题

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

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

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

4

1 回答 1

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());
于 2012-11-14T11:18:26.510 回答