繁体   English   中英

无法在Android的自定义布局中使用OnClickListener?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM