是否有可能在单击edittext时显示对话框消息?

use*_*156 15 android dialog listener android-edittext

我想点击一个edittext并显示对话日期,所以我试试

mDateDisplay = (EditText) findViewById(R.id.dateDisplay);
    mDateDisplay.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (hasFocus) {
                showDialog(DATE_DIALOG_ID);
            }
        }
    });
Run Code Online (Sandbox Code Playgroud)

该对话框将显示mDateDisplay是否为按钮

但我想使用edittext

我该怎么办?

Lal*_*ani 46

您可以使用OnClickListener事件来处理对话框,但是在禁用android:focusableInTouchModexml文件中的EditText后,就像这样.例如 - android:focusableInTouchMode="false".

因为首次触摸EditText时它会调用焦点事件,第二次触摸时会调用click事件,因此您必须先禁用焦点事件.

  • 因为Focus和Click是两个不同的事件.当元素获得焦点时可以通过键盘上的下一个/后退按钮或其他方法进行聚焦.当有人点击(触摸)元素时单击.此解决方案可以使字段无法对焦,因此可以编辑,因为它永远不会有焦点.Click事件仍然会触发,因为它已被触摸(无论它无法获得焦点). (3认同)

Ted*_*opp 11

用这个:

mDateDisplay.setClickable(true);
mDateDisplay.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        showDialog(DATE_DIALOG_ID);
    }
});
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用android:onClickXML中的属性指向Activity子类中的单击处理函数.

(当然,当然,当几乎每个人都使用兼容性库时,你可能想要创建并显示一个对话框片段而不是调用showDialog(),但这个想法是一样的.)


Kar*_*iya 5

对于我曾经使用的相同的东西:

 sel_date.setClickable(true);
 sel_date.setOnClickListener(new OnClickListener(){
        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            showDialog(DEFAULTDATESELECTOR_ID);
        }
    });
Run Code Online (Sandbox Code Playgroud)

并将选定日期设置为EditText的值:

private DateSlider.OnDateSetListener mDateSetListener =
        new DateSlider.OnDateSetListener() {
            public void onDateSet(DateSlider view, Calendar selectedDate) {
                // update the dateText view with the corresponding date
                sel_date.setText(String.format("%te-%tB-%tY", selectedDate, selectedDate, selectedDate).trim());
            }
    };
Run Code Online (Sandbox Code Playgroud)

我编辑了Android中自定义日期选择器的代码:http://blog.codeus.net/dateslider-1-0-an-alternative-datepicker-for-android/

您可以使用EditText替换Button,并执行与上述代码相同的操作.

EditText增益集中时,键盘似乎会弹出.要防止这种情况,请将focusable设置为false:

<EditText
    ...
    android:focusable="false"
    ... />
Run Code Online (Sandbox Code Playgroud)

编辑

检查以下代码:

public class Main extends Activity {
EditText et1,et2;
static final int DATE_DIALOG_ID = 0;
static final int DATE_DIALOG_ID1 = 1;
private int mYear;
private int mMonth;
private int mDay;

private int mYear1;
private int mMonth1;
private int mDay1;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    et1=(EditText)findViewById(R.id.EditText01);
    et2=(EditText)findViewById(R.id.EditText02);

    final Calendar c = Calendar.getInstance();
    mYear = c.get(Calendar.YEAR);
    mMonth = c.get(Calendar.MONTH);
    mDay = c.get(Calendar.DAY_OF_MONTH);
    et1.setText("month/year");
    et2.setText("month/year");
    et1.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub
            showDialog(DATE_DIALOG_ID);
            return false;
        }
    });

    et2.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub
            showDialog(DATE_DIALOG_ID1);
            return false;
        }
    });

}

@Override
protected Dialog onCreateDialog(int id) {
    switch (id) {
    case DATE_DIALOG_ID:
        return new DatePickerDialog(this, mDateSetListener, mYear, mMonth,
                mDay);

    case DATE_DIALOG_ID1:
        return new DatePickerDialog(this, mDateSetListener1, mYear1, mMonth1,
                mDay1);
    }
    return null;
}

// updates the date in the TextView

private void updateDisplay() {
    et1.setText(new StringBuilder()
    // Month is 0 based so add 1
            .append(mMonth + 1).append("-").append(mYear));
}
private void updateDisplay1() {

    et2.setText(new StringBuilder()
    // Month is 0 based so add 1
            .append(mMonth1 + 1).append("-").append(mYear1));
}
// the callback received when the user "sets" the date in the dialog
private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() {
    @Override
    public void onDateSet(DatePicker view, int year, int monthOfYear,
            int dayOfMonth) {
        // TODO Auto-generated method stub
        mYear = year;
        mMonth = monthOfYear;
        mDay = dayOfMonth;
        updateDisplay();
    }
};

private DatePickerDialog.OnDateSetListener mDateSetListener1 = new DatePickerDialog.OnDateSetListener() {
    @Override
    public void onDateSet(DatePicker view, int year1, int monthOfYear1,
            int dayOfMonth1) {
        // TODO Auto-generated method stub
        mYear1 = year1;
        mMonth1 = monthOfYear1;
        mDay1 = dayOfMonth1;
        updateDisplay1();
    }
};

}
Run Code Online (Sandbox Code Playgroud)