Android - 如何在自定义视图中控制嵌套视图的可见性?

时间:2014-10-17 19:17:44

标签: android android-layout android-linearlayout android-custom-view

我正在尝试在android中创建一个自定义视图,我可以像LinearLayout一样使用它。自定义视图应在我在布局中添加的内容之外添加两个TextView。如何控制自定义视图内容的可见性?我必须能够在设计时添加内容,并且在运行时应该切换嵌套内容的可见性,但不应该切换那两个TextView。 我的问题与this one有些相似,但并没有得到满意的答案。

我创建了一个扩展LinearLayout的自定义视图:

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android" >
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dp"
    android:orientation="horizontal"
    >
<TextView
    android:id="@+id/txt_title"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:text="My title"
    android:layout_marginLeft="10dp"
    />
<TextView
    android:id="@+id/txt_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight="0"
    android:layout_marginRight="10dp"
    android:text="My button"
    android:onClick="txtButton_onClick"
    android:clickable="true"
    />
</LinearLayout>
<LinearLayout
    android:id="@+id/all_contents"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:visibility="visible"
    android:layout_marginTop="10dp"
    />
    <!-- This is where I _want_ to add all nested contents to make it easy to toggle its visibility -->
</merge>

我希望所有嵌套内容都包含在底部的LinearLayout中,这样当我点击txt_button时,我可以设置all_contentsgone的可见性并使其消失。我仍然希望txt_titletxt_button继续可见,因此我可以切换显示内容。

自定义视图应该像这样调用:

<org.my.app.view.SlidingLayoutView
    android:id="@+id/slv_date_time"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    custom:titleString="Date and time"
    custom:buttonString="Change">
    <!-- This is where all nested contents should go -->
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Example nested content"
        />
</org.my.app.view.SlidingLayoutView>

我不知道如何确定嵌套内容会进入all_content LinearLayout。或者我在想这一切都错了?嵌套内容是否最终位于自定义视图的最底部,如果是这样,我如何切换其可见性而不是我的两个TextView

2 个答案:

答案 0 :(得分:0)

我会使用FrameLayout,你可以在框架内放置一个线性布局,然后将所有视图放在其中,并为每组视图创建一个新框架。 这是我所做的菜单屏幕的基本结构,只要点击一个按钮,它就会显示一个包含更多选项的新框架。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/mayne" >

<FrameLayout
    android:id="@+id/frameMain" >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

<TextView
    android:id="@+id/textView1" />

<Button
    android:id="@+id/button1" />

<Button
    android:id="@+id/button2" />

    </RelativeLayout>

</FrameLayout>

<FrameLayout
    android:id="@+id/frameDiff" >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <Button
            android:id="@+id/btnMed" />

        <Button
            android:id="@+id/btnHard" />

        <Button
            android:id="@+id/btnEasy" />

        <TextView
            android:id="@+id/textView2" />

        <Button
            android:id="@+id/btnCancel" />

    </RelativeLayout>

</FrameLayout>

答案 1 :(得分:0)

除此之外,你的意思是线性布局吗?我认为如果取出all_contents LinearLayout,你的xml应该可以工作,事情将被添加到LinearLayout。让你的xml像这样。

    <?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android" >
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dp"
    android:orientation="horizontal"
    >
    <TextView
        android:id="@+id/txt_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="My title"
        android:layout_marginLeft="10dp"
        />
    <TextView
        android:id="@+id/txt_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="0"
        android:layout_marginRight="10dp"
        android:text="My button"
        android:onClick="txtButton_onClick"
        android:clickable="true"
        />
</LinearLayout>
<!-- This is where I _want_ to add all nested contents to make it easy to toggle its visibility -->
</merge>

我会在类中添加两个方法,您可以使用它们来切换内容的可见性或顶部的textViews:

public void setTopTextViewVisibility(int visibility){
    for(int i = 0; i < getChildCount(); i ++){
        View view = getChildAt(i);
        if(view.getId() == R.id.txt_title || view.getId() == R.id.txt_button){
            view.setVisibility(visibility);
        }
    }
}

public void setContentVisibility(int visibility){
    for(int i = 0; i < getChildCount(); i ++){
        View view = getChildAt(i);
        if(!(view.getId() == R.id.txt_title || view.getId() == R.id.txt_button)){
            view.setVisibility(visibility);
        }
    }
}