[英]Cant use OnClickListener in Custom Layout in Android?
所以我制作了自己的LinearLayout,因为我需要一个水平数字选择器。 我在活动中两次使用了这种自定义布局:
XML:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/button_minus"
android:layout_width="50dp"
android:layout_height="wrap_content"
android:text="@string/lt"
android:textSize="30sp"
android:textStyle="bold" />
<EditText
android:id="@+id/number"
android:layout_width="75dp"
android:layout_height="match_parent"
android:inputType="number"
android:gravity="center"
android:focusable="false"
android:text="0" />
<Button
android:id="@+id/button_plus"
android:layout_width="50dp"
android:layout_height="wrap_content"
android:text="@string/gt"
android:textSize="30sp"
android:textStyle="bold" />
</LinearLayout>
JAVA:
public class NumberPickerHorizontal extends LinearLayout
{
private final EditText number;
private final Button button_minus, button_plus;
public NumberPickerHorizontal(Context context) {
super(context);
LayoutInflater.from(context).inflate(R.layout.numberpicker_horizontal, this, true);
number = (EditText) findViewById(R.id.number);
button_minus = (Button) findViewById(R.id.button_minus);
button_minus.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
int count = Integer.parseInt(number.getText().toString());
number.setText(count--);
}
});
button_plus = (Button) findViewById(R.id.button_plus);
button_plus.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
int count = Integer.parseInt(number.getText().toString());
number.setText(count++);
}
});
}
}
您会注意到我试图激活加号和减号按钮的onClick方法。但是,当我实际单击按钮时,出现以下错误:
android.content.res.Resources $ NotFoundException:字符串资源ID#0x0
不太确定我在做什么错。
您正在尝试将setText
为0,该字符串应为字符串resource(int)。 同样,您从未使用过您增加的新价值。 在设置文本之前增加计数。 然后使用setText(String.valueOf(increased count value))
。
你应该做这个:
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<Button
android:id="@+id/button_minus"
android:layout_width="50dp"
android:layout_height="wrap_content"
android:text="@string/lt"
android:textSize="30sp"
android:textStyle="bold" />
<EditText
android:id="@+id/number"
android:layout_width="75dp"
android:layout_height="match_parent"
android:inputType="number"
android:gravity="center"
android:focusable="false"
android:text="0" />
<Button
android:id="@+id/button_plus"
android:layout_width="50dp"
android:layout_height="wrap_content"
android:text="@string/gt"
android:textSize="30sp"
android:textStyle="bold" />
</merge>
Java:
public class NumberPickerHorizontal extends LinearLayout
{
private final EditText number;
private final Button button_minus, button_plus;
@Override
public NumberPickerHorizontal(Context context) {
super(context);
init(context);
}
@Override
public NumberPickerHorizontal(Context context, AttributeSet attributeSet) {
super(context, attributeSet);
init(context);
}
@TargetApi(11)
@Override
public NumberPickerHorizontal(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
@TargetApi(21)
@Override
public NumberPickerHorizontal(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init(context);
}
private void init(Context context) {
//android:layout_width="match_parent"
//android:layout_height="wrap_content"
//set these where you instantiate the view, XML or code!
this.setOrientation(LinearLayout.HORIZONTAL);
LayoutInflater.from(context).inflate(R.layout.numberpicker_horizontal, this, true);
number = (EditText) findViewById(R.id.number);
button_minus = (Button) findViewById(R.id.button_minus);
button_minus.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
int count = Integer.parseInt(number.getText().toString());
count--;
number.setText(String.valueOf(count));
}
});
button_plus = (Button) findViewById(R.id.button_plus);
button_plus.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
int count = Integer.parseInt(number.getText().toString());
count++;
number.setText(String.valueOf(count));
}
});
}
因此更改为:
1.)添加了<merge>
来删除重复的布局
2.)为框架添加了其余3个构造函数,以防框架调用它们
3.)在您的int
周围添加了String.valueOf()
,以便setText()
不会将其视为资源标识符。
尝试这个:
View v = LayoutInflater.from(context).inflate(R.layout.numberpicker_horizontal, this, true);
并将所有findViewById
替换为v.findViewById
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.