Пользовательский компонент в Android Studio - PullRequest
0 голосов
/ 06 ноября 2019

Я пытаюсь создать пользовательский компонент, который состоит из множества других компонентов. Мне нужно иметь возможность использовать его так же, как и компоненты типа TextView или EditText. Я не могу найти какие-либо учебники в Интернете о том, как это сделать, и я не совсем уверен, что даже искать. У меня есть несколько, которые мне нужно сделать, но вот пример одного из них:

input_textbox.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_margin="5dp"
    android:background="@drawable/bg_form_info"
    android:layout_width="wrap_content"
    android:layout_height="@dimen/form_info_height">

    <TextView
        android:id="@+id/label"
        android:hint="@string/label"
        android:textSize="@dimen/label_text_size"
        android:visibility="visible"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <EditText
        android:id="@+id/display"
        android:hint="@string/display"
        android:textSize="@dimen/form_info_text_size"
        android:layout_alignParentBottom="true"
        android:background="@android:color/transparent"
        android:paddingLeft="@dimen/input_horizontal_padding"
        android:paddingRight="@dimen/input_horizontal_padding"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <ImageButton
        android:id="@+id/error_icon"
        android:contentDescription="@string/error"
        android:src="@drawable/ic_error"
        android:background="@android:color/transparent"
        android:clickable="true"
        android:focusable="false"
        android:visibility="visible"
        android:paddingRight="@dimen/input_horizontal_padding"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:layout_centerVertical="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</RelativeLayout>

Textbox.java

public class Textbox extends [WHAT GOES HERE] {
    TextView inputLabel;
    EditText inputField;
    ImageButton errorIcon;
    String errorMessage;

    public Textbox(Context context, String label) {
        super(context);
        init(label);
    }

    public Textbox(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(""); // I don't know how to pass the label here
    }

    public Textbox(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(""); // or here
    }

    private void init(String label) {
        inputLabel = findViewById(R.id.label); // How do I connect this class to the xml?
        inputLabel.setText(label);

        inputField = findViewById(R.id.input_field);
        inputField.setHint(label);
        inputField.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) { }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                inputLabel.setVisibility((count > 0) ? View.VISIBLE : View.GONE);
            }

            @Override
            public void afterTextChanged(Editable s) { }
        });

        errorIcon = findViewById(R.id.error_icon);
        errorIcon.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                showErrorMessage();
            }
        });
    }

    public String getErrorMessage() {
        return errorMessage;
    }
    public void showErrorMessage() {
        showToast(getContext(), errorMessage);
    }

    public String getValue() {
        return inputField.getText().toString();
    }
    public void setValue(String value) {
        inputField.setText(value);
    }

    public void showErrorIcon(String errorMessage) {
        this.errorMessage = errorMessage;
        showErrorMessage();
        errorIcon.setVisibility(VISIBLE);
    }
    public void hideErrorIcon() {
        this.errorMessage = "";
        errorIcon.setVisibility(GONE);
    }
}

activity_main.xml

...

<com.example.application.inputs.Textbox
    android:id="@+id/test_textbox"
    android:layout_below="@id/end_date_display"
    [HOW DO I ADD THE LABEL AND OTHER OPTIONS?]
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

...

Любая помощь будет отличной, или даже ссылка на видео на YouTube лучше, чем ничего.

1 Ответ

0 голосов
/ 06 ноября 2019

Вы можете запустить свое собственное текстовое поле в классе «Активность», например

public TextBox mTextBox = new TextBox(label)

, добавить его в родительское представление.


Если вы хотите установить метку представления вxml,

добавьте публичный метод в ваш пользовательский класс, например

public void setTag(String input) {
   inputLabel.setText(input)
}

и установите тег из кода.

public textBoxReferred = findViewById(R.id.test_testbox)

textBoxReferred.setText("THE TAG")
...