我只想使用RelativeLayout制作一个按钮,所以我可以在里面放置任意数量的drawables或textfields,并且我希望所有的孩子都能根据RelativeLayout状态改变颜色或drawable。 如果我按下自定义按钮,它必须具有正确的颜色和绘图。
这是一些代码(示例中只有一个TextView和一个ImageView):
在main.xml中,父布局是LinearLayout,这是自定义按钮:
<RelativeLayout
android:id="@+id/relativelayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dip"
android:layout_marginRight="10dip"
android:layout_marginTop="25dp"
android:background="@drawable/background_state"
android:clickable="true"
android:focusable="true" >
<TextView
android:id="@+id/textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_marginLeft="8dip"
android:clickable="true"
android:text="Awesome text"
android:textColor="@color/textview_state"
android:textSize="20sp" />
<ImageView
android:id="@+id/imageview"
android:layout_width="51dip"
android:layout_height="51dip"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="5dip"
android:clickable="true"
android:src="@drawable/imageview_state" />
<View
android:layout_width="wrap_content"
android:layout_height="1dp"
android:layout_alignParentTop="true"
android:background="#FFFFFF"
android:clickable="false"
android:focusable="false" />
<View
android:layout_width="wrap_content"
android:layout_height="1dp"
android:layout_alignParentTop="true"
android:layout_marginTop="50dip"
android:background="#D3E992"
android:clickable="false"
android:focusable="false" />
</RelativeLayout>
在drawable文件夹中,imageview_state.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/imageview_pressed"
android:state_pressed="true" />
<item android:drawable="@drawable/imageview" />
</selector>
在drawable-hdpi文件夹中,有imageview.png和imageview_pressed.png。
在颜色文件夹中,background_state.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="#E0EBCC"/>
<item android:drawable="#669900"/>
</selector>
在color文件夹中,textview_state.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
android:color="#000"/>
<item android:color="#FFF"/>
</selector>
到目前为止,当我点击RelativeLayout时,RelativeLayout的背景会正确更改,但ImageView和TextView会保持默认状态。 我尝试为TextView和ImageView设置属性android:clickable =“true”,但只有被按下的元素才会改变其状态,而不是整个按钮。
欢迎任何帮助实现我的目标:)
答案 0 :(得分:0)
您可以在相对布局上设置OnClickListener,然后在单击代码时在代码中执行某些操作。喜欢这个伪代码。
RelativeLayout rl = (RelativeLayout) findViewById(R.id.myRelLayout);
rl.setOnClickListener(.....) {
button1.setBackgroudDrawable(R.drawable.newColor).
text1.setText("Something");
}
答案 1 :(得分:0)
根据Booger的建议,我使用了OnTouchListener,我基本上都是在内部进行更改。它工作得很好,我更喜欢xml解决方案,但无论如何。 在我的活动中:
RelativeLayout relativeLayout= (RelativeLayout) findViewById(R.id.relativelayout);
relativeLayout.setOnTouchListener(...);
监听器的实现:
public boolean onTouch(View v, MotionEvent event)
{
TextView text = (TextView) findViewById(R.id.textview);
ImageView image = (ImageView) findViewById(R.id.imageview);
RelativeLayout layout = (RelativeLayout) findViewById(R.id.relativelayout);
if (event.getAction() == android.view.MotionEvent.ACTION_DOWN)
{
layout.setBackgroundResource(R.color.background_pressed);
text.setPressed(true);
image.setPressed(true);
} else if (event.getAction() == android.view.MotionEvent.ACTION_UP)
{
layout.setBackgroundResource(R._background);
text.setPressed(false);
image.setPressed(false);
}
return false;
}
我以编程方式执行所有操作,尽管RelativeLayout的背景使用xml正确地更改了其状态,因为xml比代码更快,因此可以看到延迟。 现在RelativeLayout背景属性设置为:
android:background="@color/background"
不再提及选择器了。