我为多次使用的按钮格式创建了一个布局。按钮格式有TextView和ImageView。通过我在主要活动中包含此布局的方式,我认为我无法在Java或XML中动态更改内部TextView的文本。我可以采用不同的方式来设置内部TextView的文本吗?
布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/settingslayout">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="25dp"
android:layout_marginTop="13dp"
android:textSize="20dp"
android:text="CHANGE ME"
android:id="@+id/text" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:layout_marginRight="25dp"
android:layout_alignParentRight="true"
android:src="@drawable/left"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:maxHeight="30dp"
android:maxWidth="30dp"/>
</RelativeLayout>
主要活动:
...
<include layout="@layout/settings_layout"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_below="@+id/accountStaticUnderline"
android:id="@+id/termBegin"
android:text="TEST" /> //DOESNT WORK
...
</RelativeLayout>
答案 0 :(得分:1)
当然,只需在您的活动中输入此代码
即可((TextView)findViewById(R.id.text)).setText("enter_text_here");
答案 1 :(得分:1)
设置该方式的文字无效,因为android:text
不适用于<include>
标记。更具体地说,它不适用于被包含的东西,即RelativeLayout
。 (您无法将android:text
放在RelativeLayout
上,并将其应用于TextView
,您也不希望这样做。)
我的第一个建议(以及最简单的即时解决方案)是使用TextView
内置的对复合drawable的支持,因此您只需使用TextView
而不是include
s您想要的属性的样式资源。
如果这对您的用例不够好,那么您可能需要制作自定义视图。此视图将替换RelativeLayout
,并将TextView
和ImageView
作为子级。要确定的主要内容是创建子项的位置和方式以及获取它们的引用:在构造父项时,可以使用Java手动创建它们;或者您可以使用<include>
和/或<merge>
s的某些布局组合。使文本属性有效需要使用<declare-styleable>
。
我假设你希望孩子们总是看起来一样,并且你想重用你已经做过的布局(即你不想手动设置所有属性),所以这就是我可能会做的:< / p>
public class MyButton extends RelativeLayout {
private TextView mTextView;
private ImageView mImageView;
public MyButton(Context context) {
super(context);
init(context, null);
}
public MyButton(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
public MyButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs);
}
public MyButton(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init(context, attrs);
}
private void init(Context context, AttributeSet attributeSet) {
LayoutInflater inflater = LayoutInflater.from(context);
inflater.inflate(R.layout.my_button, this, true); // used with merge tag
mTextView = (TextView) findViewById(R.id.text);
mImageView = (ImageView) findViewById(R.id.image);
int[] attrs = {android.R.attr.text};
TypedArray a = context.obtainStyleAttributes(attributeSet, attrs);
String text = a.getString(0, null);
mTextView.setText(text);
a.recycle();
}
}
在res/layout/my_button.xml
:
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="25dp"
android:layout_marginTop="13dp"
android:textSize="20dp"
android:text="CHANGE ME"
android:id="@+id/text" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:layout_marginRight="25dp"
android:layout_alignParentRight="true"
android:src="@drawable/left"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:maxHeight="30dp"
android:maxWidth="30dp"/>
</merge>
在您的活动布局中:
...
<!-- no more include -->
<com.package.MyButton
android:id="@+id/something"
android:layout_width="..."
android:layout_height="..."
android:text="..." />
<!-- you can have multiple instances with different IDs -->
<com.package.MyButton
android:id="@+id/something_else"
android:layout_width="..."
android:layout_height="..."
android:text="..." />
...
您也可以使用自己的<declare-styleable>
作为自定义视图,如果以后要为其提供自定义XML属性,这将是必要的,但上述方法应该足够了。