包含布局的按钮Onclick Listener

时间:2010-11-08 07:30:26

标签: android layout include listeners buttonclick

我膝盖弯曲,来到你身边。我对Android比较陌生,所以请原谅我所说的任何亵渎神灵的事情。

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

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

我的问题是:我是否可以定义一个可在整个应用程序中运行的按钮单击侦听器,可以使用 android:onClick Button的属性?

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

3 个答案:

答案 0 :(得分:17)

我在几个布局中使用的菜单遇到了同样的问题。我通过在扩展RelativeLayout的类中膨胀布局xml文件解决了这个问题,然后我定义了onClickListener。之后我在每个需要菜单的布局中包含了课程。代码看起来像这样:

<强> menu.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>

<强> MenuView.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));
        }
    };  
}

<强> layout.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)。

答案 1 :(得分:3)

这种情况在不久的将来会被添加到roboguice中。它允许您为标题栏和页脚等内容构建控制器类,并为您自动启动事件。

结帐http://code.google.com/r/adamtybor-roboguice/了解最初的峰值。

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

不幸的是,您仍然需要将控制器添加到每个活动中,就像您使用include布局一样,但好消息是所有内容都会为您连接,并且您的所有逻辑都保留在一个类中。

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

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;
}

答案 2 :(得分:0)

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