0

我的布局xml文件如下:

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

    <ListView
        android:id="@+id/action_bar_item_list"
        android:layout_above="@+id/mybutton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </ListView>

    <Button
        android:id="@+id/mybutton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:text="Button" />

    <LinearLayout
        android:id="@+id/messagelayout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/message"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Large Text"
            android:textAppearance="?android:attr/textAppearanceLarge" />

    </LinearLayout>

</RelativeLayout>

如果单击 mybutton,messagelayout 将设置为可见。
虽然 messagelayout 是可见的,但我想做一个诸如 setCanceledOnTouchOutside of dialog 之类的功能。
当用户在messagelayout旁边触摸屏时,它会将messagelayout设置为消失,并且不做任何其他事情。
如果我不想使用对话框,我该怎么做?

4

1 回答 1

1

您可以通过在 messageLayout 周围创建另一个布局来做到这一点

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

    <ListView
        android:id="@+id/action_bar_item_list"
        android:layout_above="@+id/mybutton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </ListView>

    <Button
        android:id="@+id/mybutton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:text="Button" />

    <RelativeLayout
        android:id="@+id/messageWrapper"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#00000000">

        <LinearLayout
            android:id="@+id/messagelayout"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:orientation="vertical" >

            <TextView
                android:id="@+id/message"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Large Text"
                android:textAppearance="?android:attr/textAppearanceLarge" />

        </LinearLayout>

    </RelativeLayout>

</RelativeLayout>

在消息布局周围创建一个包装器,并让它覆盖所有区域。请注意,背景颜色是透明的(#00000000 不是 #000000)。现在在包装器上设置一个 onClickListener 以捕获 messageLayout 之外的所有点击。

wrapper = (RelativeLayout) findViewById(R.id.wrapper);
wrapper.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        // Hide the view
    }
});

这将捕获包装器上的所有点击,但不幸的是它也会捕获 messageLayout 上的点击,因此您需要在 messageLayout 上创建一个 onClickListener。

messageLayout = (LinearLayout) findViewById(R.id.messagelayout);
messageLayout.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        // If you do not need to anything here, just leave it blank but it has to be implemented.
    }
});

这将使您的包装器像一个对话框一样。要显示/隐藏 messageLayout,您需要在包装器上设置 Visibility 而不是 messageLayout。

于 2013-05-04T05:04:43.983 回答