22

我屈膝来找你,手里拿着问题。我对 Android 比较陌生,所以请原谅我可能会说的任何亵渎神明的话。

简介:我在应用程序中有几个布局,都必须包含一个公共页脚。这个页脚有一些必要的按钮,用于返回主页、注销等。

在 Include 和 Merge 标签的帮助下,我设法让这个页脚出现在所有必需的页面中。问题在于为所有按钮定义点击监听器。尽管我可以在与包含页脚布局的屏幕相关联的每个活动中定义侦听器,但我发现当屏幕数量增加时这会变得非常乏味。

我的问题是:我可以定义一个可以在整个应用程序中工作的按钮单击侦听器,可以使用按钮的android:onClick属性从任何屏幕访问它吗?

也就是说,我想在一个单独的类中定义一次按钮单击侦听器,例如FooterClickListeners,并将该类简单地命名为任何按钮单击页脚的侦听器类。这个想法是为侦听器代码创建一个单点访问,以便对所述侦听器的任何和所有更改都将反映在整个应用程序中。

4

3 回答 3

18

我在几个布局中使用的菜单也有同样的问题。我通过在扩展RelativeLayout的类中扩展布局xml文件解决了这个问题,然后我在其中定义了onClickListener。之后,我在需要菜单的每个布局中都包含了该类。代码如下所示:

菜单.xml

<?xml version="1.0" encoding="utf-8"?>

<merge xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <ImageButton android:id="@+id/map_view"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:src="@drawable/button_menu_map_view"
        android:background="@null"
        android:scaleType="fitCenter"
        android:layout_height="@dimen/icon_size"
        android:layout_width="@dimen/icon_size">
    </ImageButton>

    <ImageButton android:id="@+id/live_view"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:src="@drawable/button_menu_live_view"
        android:background="@null"
        android:scaleType="fitCenter"
        android:layout_height="@dimen/icon_size"
        android:layout_width="@dimen/icon_size">
    </ImageButton>

    <ImageButton android:id="@+id/screenshot"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:src="@drawable/button_menu_screenshot"
        android:background="@null"
        android:scaleType="fitCenter"
        android:layout_height="@dimen/icon_size"
        android:layout_width="@dimen/icon_size">
    </ImageButton>

</merge>

菜单视图.java

public class MenuView extends RelativeLayout {

    private LayoutInflater inflater;

    public MenuView(Context context, AttributeSet attrs) {
        super(context, attrs);

        inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate(R.layout.menu, this, true);

        ((ImageButton)this.findViewById(R.id.screenshot)).setOnClickListener(screenshotOnClickListener);        
        ((ImageButton)this.findViewById(R.id.live_view)).setOnClickListener(liveViewOnClickListener);       
        ((ImageButton)this.findViewById(R.id.map_view)).setOnClickListener(mapViewOnClickListener);
    }

    private OnClickListener screenshotOnClickListener = new OnClickListener() {
        public void onClick(View v) {
            getContext().startActivity(new Intent(getContext(), ScreenshotActivity.class));
        }
    };  

    private OnClickListener liveViewOnClickListener = new OnClickListener() {
        public void onClick(View v) {
            getContext().startActivity(new Intent(getContext(), LiveViewActivity.class));
        }
    };

    private OnClickListener mapViewOnClickListener = new OnClickListener() {
        public void onClick(View v) {
            getContext().startActivity(new Intent(getContext(), MapViewActivity.class));
        }
    };  
}

布局.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/main"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <SurfaceView android:id="@+id/surface"
        android:layout_width="fill_parent"
        android:layout_weight="1"
        android:layout_height="fill_parent">

    </SurfaceView>

    <!-- some more tags... -->

    <com.example.inflating.MenuView
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" />

</RelativeLayout>

使用<com.example.inflating.MenuView />标签,您现在可以在其他布局中重用您自己编写的布局(包括 onClickListener)。

于 2011-01-08T23:05:51.190 回答
3

这是在不久的将来添加到 roboguice 中的东西。它将允许您为标题栏和页脚等内容构建控制器类,并为您自动装配事件。

查看http://code.google.com/r/adamtybor-roboguice/以了解初始峰值。

基本上,如果您使用的是 roboguice,您可以为页脚定义一个组件,然后将该页脚组件注入每个活动。

不幸的是,您仍然必须将控制器添加到每个活动中,就像您对包含布局所做的那样,但好消息是一切都为您连接好了,您的所有逻辑都保留在一个类中。

下面是一些示例用法的一些伪代码。

public class FooterController {
  @InjectView(R.id.footer_button) Button button;

  @Inject Activity context;

  @ContextObserver
  public void onViewsInjected() {
    button.setOnClickListener(new OnClickListener() {
       void onClick() {
         Toast.makeToast(context, "My button was clicked", Toast.DURATION_SHORT).show();
        }
    });
  }
}

public class MyActivity1 extends RoboActivity {
  @Inject FooterController footer;
}

public class MyActivity2 extends RoboActivity {
  @Inject FooterController footer;
}
于 2010-12-27T21:55:21.453 回答
0

您描述的解决方案是不可能的,对不起。但是对于所有使用页脚的活动,您可以拥有共同的父活动。在活动中,只需为您的页脚按钮提供处理程序方法,然后每次需要处理页脚操作时都从它继承。

于 2010-11-08T07:35:03.207 回答