使用按钮创建EditText

时间:2017-07-06 11:43:30

标签: android android-edittext android-view

我必须使用内部按钮创建EditText并分配按下按钮后将运行的功能。然后我想让它可重用 - 不知何故将它作为元素添加到我的Activity中。我想知道如何扩展EditTextView并添加按钮并在其中创建函数。 有什么建议/教程吗?

4 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

这是你需要做的:

 <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
}
});

答案 2 :(得分:1)

如果你想在编辑文本中有一些图标或按钮,你可以这样做,

  

注意:在这里我只使用setCompoundDrawablesWithIntrinsicBounds,   因此,如果您想要更改图标位置,您可以使用它来实现   setIcon中的setCompoundDrawablesWithIntrinsicBounds。

像这样创建一些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);
    }
}
  

如果您想更改触控区域,可以更改    EXTRA_TOUCH_AREA 值默认我给了50。

对于启用按钮并单击侦听器,您可以从此活动或片段中调用

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);
            }
        });

答案 3 :(得分:0)

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

<template>
  <div id="app">
    <products :results="results"></products>
  </div>
</template>

<script>
import Products from './components/Products'

const NYTBaseUrl = "https://api.nytimes.com/svc/topstories/v2/";
const ApiKey = "18e1540d187c4b46bae767782750f9fd";
const SECTIONS = "home, arts, automobiles, books, business, fashion, food, health, insider, magazine, movies, national, nyregion, obituaries, opinion, politics, realestate, science, sports, sundayreview, technology, theater, tmagazine, travel, upshot, world";

function buildUrl (url) {
  return NYTBaseUrl + url + ".json?api-key=" + ApiKey
}

export default {
  name: 'app',
  data: function(){
    return {
    results: [],
    sections: SECTIONS.split(', '), // create an array of the sections
    section: 'home', // set default section to 'home'
    loading: true,
    title: ''
    }
  },
  components: {
    Products
  },
  mounted(){
    this.getPosts('home');
  },
  methods:{
    getPosts(section) {
      let url = buildUrl(section);
      axios.get(url).then((response) => {
        this.loading = false;
        this.results = response.data.results;
        let title = this.section !== 'home' ? "Top stories in '"+ this.section + "' today" : "Top stories today";
        this.title = title + "(" + response.data.num_results+ ")";
      }).catch((error) => { console.log(error); });
    }    
  }
}
</script>