使用按钮创建 EditText

Creating EditText with button

我必须创建内部带有按钮的 EditText 并分配函数,按下按钮后将 运行。然后我想让它可重复使用——以某种方式将它作为一个元素添加到我的 Activity 中。我想知道如何扩展 EditTextView 并添加按钮并在其中创建函数。 有什么建议/教程吗?

您需要创建自定义视图组件

下面的链接有示例,可以解决您的问题

https://developer.android.com/training/custom-views/index.html

https://developer.android.com/guide/topics/ui/custom-components.html

您可以扩展LinearLayout 或RelativeLayout 并在构造函数中添加Button 和EditText。但是,您需要使用 getter 方法来获取 EditText 或 Button。这是一个例子。我还没有测试过,但它应该给你一个想法。请记住,如果您想使用 Button 或 EditText 的 xml 属性,您应该在 attr.xml 中定义它们,然后使用 TypedArray 获取它们。由于对象是 LinearLayout,如果不在 attr.xml.

中定义它们,则不能使用 EditText 或 Button 属性
public class CustomEditText extends LinearLayout {

private AppCompatButton mButton;
private AppCompatEditText mEditText;

public CustomEditText(Context context) {
    this(context, null, 0);
}

public CustomEditText(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
}

public CustomEditText(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);

    setOrientation(HORIZONTAL);

    /** Get Attributes **/

    TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CustomEditText);

    int lines = typedArray.getInt(R.styleable.CustomEditText_android_lines, 1);
    int gravity = typedArray.getInt(R.styleable.CustomEditText_android_gravity, Gravity.CENTER_VERTICAL);
    int inputType = typedArray.getInt(R.styleable.CustomEditText_android_inputType, InputType.TYPE_CLASS_TEXT);
    int imeOptions = typedArray.getInt(R.styleable.CustomEditText_android_imeOptions, EditorInfo.IME_ACTION_DONE);
    String hint = typedArray.getString(R.styleable.CustomEditText_hint);

    typedArray.recycle();

    /** Construct Button **/

    mButton = new AppCompatButton(context);
    addView(mButton);

    /** Construct EditText **/

    mEditText = new AppCompatEditText(context);
    mEditText.setGravity(gravity);
    mEditText.setHint(hint);
    mEditText.setImeOptions(imeOptions | EditorInfo.IME_FLAG_NO_EXTRACT_UI);
    mEditText.setInputType(inputType | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
    if (!((inputType & InputType.TYPE_TEXT_FLAG_MULTI_LINE) == InputType.TYPE_TEXT_FLAG_MULTI_LINE
            && lines == 1)) mEditText.setLines(lines);
    addView(mEditText);
}

public AppCompatEditText getEditText() {
    return mEditText;
}

public AppCompatButton getButton() {
    return mButton;
}
}

这是你需要做的:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/linearLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <RelativeLayout
            android:id="@+id/relativeLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <EditText
                android:id="@+id/edittext"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:completionHint="yourhint"
                android:dropDownHeight="match_parent"
                android:hint="From"
                android:padding="20dp"
                android:visibility="visible"
                />
            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@id/image"
                android:layout_alignParentRight="true"
                />
        </RelativeLayout>


      </LinearLayout>

然后将 OnClicklistener 设置为您的 OnCreate 方法中的按钮,如下所示:

Button image = (Button) findViewById(R.id.image);
image.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view){
//handle your on click event here
}
});

如果你想在编辑文本中添加一些图标或按钮,你可以这样实现,

Note: In this just I am using setCompoundDrawablesWithIntrinsicBounds, So if you want to change the icon position you can achieve that using setCompoundDrawablesWithIntrinsicBounds in setIcon.

像这样创建一些 CustomEditText,

public class MKEditText extends AppCompatEditText {

    public interface IconClickListener {
        public void onClick();
    }

    private IconClickListener mIconClickListener;

    private static final String TAG = MKEditText.class.getSimpleName();

    private final int EXTRA_TOUCH_AREA = 50;
    private Drawable mDrawable;
    private boolean touchDown;

    public MKEditText(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public MKEditText(Context context) {
        super(context);
    }

    public MKEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void showRightIcon() {
        mDrawable = ContextCompat.getDrawable(getContext(), R.drawable.ic_android_black_24dp);

        setIcon();
    }

    public void setIconClickListener(IconClickListener iconClickListener) {
        mIconClickListener = iconClickListener;
    }

    private void setIcon() {
        Drawable[] drawables = getCompoundDrawables();

        setCompoundDrawablesWithIntrinsicBounds(drawables[0], drawables[1], mDrawable, drawables[3]);

        setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
        setSelection(getText().length());
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        final int right = getRight();
        final int drawableSize = getCompoundPaddingRight();
        final int x = (int) event.getX();
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                if (x + EXTRA_TOUCH_AREA >= right - drawableSize && x <= right + EXTRA_TOUCH_AREA) {
                    touchDown = true;
                    return true;
                }
                break;
            case MotionEvent.ACTION_UP:
                if (x + EXTRA_TOUCH_AREA >= right - drawableSize && x <= right + EXTRA_TOUCH_AREA && touchDown) {
                    touchDown = false;
                    if (mIconClickListener != null) {
                        mIconClickListener.onClick();
                    }
                    return true;
                }
                touchDown = false;
                break;

        }
        return super.onTouchEvent(event);
    }
}

If you want to change the touch area you can change the EXTRA_TOUCH_AREA values default I gave as 50.

对于启用按钮和点击监听器,您可以像这样从 Activity 或 Fragment 中调用,

MKEditText mkEditText = (MKEditText) findViewById(R.id.password);
mkEditText.showRightIcon();
mkEditText.setIconClickListener(new MKEditText.IconClickListener() {
            @Override
            public void onClick() {
              // You can do action here. ex you can start activity here like this
               startActivityForResult(new Intent(MainActivity.this, SampleActivity.class), 1);
            }
        });