我正在尝试在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_contents
到gone
的可见性并使其消失。我仍然希望txt_title
和txt_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
?
答案 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);
}
}
}