从视图中启动活动

时间:2011-10-04 15:29:28

标签: android android-activity

我想知道以模块化方式从其他视图处理启动活动的最佳方法是什么。我试图找出一种方法告诉我的“按钮”一旦在'onTouchEvent'中选择了哪个活动就会触发。目前,我有一个主要活动,创建并设置我的'MainMenu'视图。我的主菜单定义了一个MenuItem类,它定义了一个用于绘制按钮的矩形,并在相交/触摸/单击时触发了一个活动。但是,我在开展这项活动时遇到了一些困难。下面是一些代码片段,展示了我正在努力实现的一些目标:

public class MainMenu extends View {
...
private Vector<MenuItem> menuItems;
private MenuItem testButton;
private MenuItem testButton2;

public MainMenu(Context context) {
    ...
    // Create our menu buttons and load their specific images
    testButton = new MenuItem(context, new OptionsMenu(), 150, 50, imgButtons, 256, 64, 0, 0);
    testButton2 = new MenuItem(context, OptionsMenu.class, 150, 200, imgButtons, 256, 64, 0, 0);

    // Store our buttons
    menuItems = new Vector<MenuItem>(5, 2);
    menuItems.add(testButton);
    menuItems.add(testButton2);
}

...

@Override
public boolean onTouchEvent(MotionEvent event) {
    if (event.getAction() != MotionEvent.ACTION_DOWN)
        super.onTouchEvent(event);

    // Create our menu item iterator 
    Iterator<MenuItem> menuItemsIter = menuItems.iterator();
    Object element;

    // Loop through our menu items, drawing them
    while(menuItemsIter.hasNext()) {
        element = menuItemsIter.next();
        if(((MenuItem)element).HasIntersected((int)event.getX(), (int)event.getY())) {
            ((MenuItem)element).LaunchActivity();
        }
    }

    return true;
}
}

class MenuItem  {
...
private Context container = null;   // Indicates which activity contains us
private Object startObject = null;  // Which activity we'll start/execute

public MenuItem(Context context, Object object, int xPos, int yPos, Bitmap image, 
                int imageWidth, int imageHeight, int xOffset, int yOffset) {
    ...
    container = context;
    startObject = object;
}

... 

public void LaunchActivity() {
    if(startObject != null) {
        Intent activity = new Intent(container, startObject.getClass());
        container.startActivity(activity);
    }
}
}

我尝试以两种不同的方式设置我的MenuItem的对象(新的OptionsMenu()和OptionsMenu.class),但似乎都不起作用。我尝试在创建新的Intent时避免使用MenuItem的startObject,而是使用(container,optionsMenu.class)作为参数。哪个也没用。据我所知,这是发起一项活动的正确方法,但我猜我在某个地方错过了一步。

另外,我读了一些提及使用回调的文章/帖子,但是在Activity端而不是View端。但是,我不应该使用内置的Android回调,或者我是否应该创建自己的回调并设置我自己的系统。

任何关于我做错了什么的信息,或者我能以不同的方式采取不同的做法/更好的方法,我们将不胜感激。感谢。

1 个答案:

答案 0 :(得分:1)

恕我直言,只有Button支持向OnClickListener发送点击事件,您的自定义View应该有自己的自定义事件接口,用于将自己的自定义事件发送到控制器(例如,一个活动)。控制器可以安排对这些事件做一些事情,例如启动其他活动。