android - 包含布局中的按钮 Onclick 监听器

标签 android layout include listeners buttonclick

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

简介:我在应用中有几个布局,它们都必须包含一个共同的页脚。这个页脚有一些必不可少的按钮,用于返回主页、注销等。

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

我的问题是这样的:我可以定义一个按钮点击监听器,它可以在整个应用程序中工作,可以使用 android:onClick 按钮的属性?

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

最佳答案

我在多个布局中使用的菜单也遇到了同样的问题。我通过在扩展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)。

关于android - 包含布局中的按钮 Onclick 监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4121986/

相关文章:

Android布局标题栏不可见

c# - EF Core 选择一个由相关实体过滤的实体

android - 如何确保按钮在此 Android 登录对话框中水平对齐?

java - ListView 共享元素转换问题

layout - 如何 'force' Magento加载不同的布局

Android gridview,如何去除网格项之间的间隙

java - 在 Android 中搜索带有关键字的任何网页

java - 通过 ksoap2 从 Android 调用 Java Web 服务

c - C 标准库中的头文件可以包含另一个头文件吗?

c++ - 为什么链接器看不到我的函数(定义宏来替代系统日志)?