web-dev-qa-db-ja.com

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

MDateDisplayがボタンであるかどうかをダイアログに表示します

しかし、edittextを使用したい

私は何をすべきか?

15
user790156

これを使って:

_mDateDisplay.setClickable(true);
mDateDisplay.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        showDialog(DATE_DIALOG_ID);
    }
});
_

または、XMLの_Android:onClick_属性を使用して、Activityサブクラスのクリック処理関数を指すこともできます。

(もちろん、最近では、ほとんどの人が互換性ライブラリを使用している場合、showDialog()を呼び出すのではなく、ダイアログフラグメントを作成して表示することをお勧めしますが、考え方は同じです。)

11
Ted Hopp

OnClickListenerイベントを使用してダイアログボックスを処理できますが、このようにxmlファイルでEditTextのAndroid:focusableInTouchModeを無効にした後です。例-Android:focusableInTouchMode="false"

EditTextが最初にタッチされると、フォーカスイベントが呼び出され、2回目にタッチされると、クリックイベントが呼び出されるため、最初にフォーカスイベントを無効にする必要があります。

43
Lalit Poptani

私が使用したのと同じことのために:

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

そして、選択した日付を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());
            }
    };

Android: http://blog.codeus.net/dateslider-1-0-an-alternative-datepicker-for-Android)のカスタム日付ピッカーからコードを編集しました/

ButtonをEditTextに置き換えて、上記のコードと同じことを行うことができます。

EditTextがフォーカスを取得すると、キーボードがポップアップするように見えます。これを防ぐには、focusableをfalseに設定します。

<EditText
    ...
    Android:focusable="false"
    ... />

編集済み

次のコードを確認してください。

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

}
5
Kartik Domadiya

私も同様の問題に直面しました。簡単にするために、それを解決するために、私は次のコードを使用しました:

editText.setClickable(true);
editText.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        // showDialog
    }
});

XMLの場合:

<EditText
     ...
     Android:focusableInTouchMode="false" 
 />

そのため、ユーザーはEditTextを編集できず、クリックするだけで済みます。

4
Leonardo Costa

これは、必要な出力を提供する完璧なコードです。

public class TextView_Calendar extends Activity {
EditText et1,et2;
static final int DATE_DIALOG_ID = 0;

private int mYear;
private int mMonth;
private int mDay;

/** 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.et1);

    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");
    et1.setOnTouchListener(new OnTouchListener()
    {
        public boolean onTouch(View v, MotionEvent event)
        {
            showDialog(DATE_DIALOG_ID);
            return false;
        }
    });

}

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

// updates the date in the TextView

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

// the callback received when the user "sets" the date in the dialog
private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() {
    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
        mYear = year;
        mMonth = monthOfYear;
        mDay = dayOfMonth;
        updateDisplay();
    }
};

}
2
Ankit Dhadse

私はそれをonFocusChangeListenerで次のように行いました。

mCompleteByEditText = (EditText) findViewById(R.id.completion);
        mCompleteByEditText
                .setOnFocusChangeListener(new OnFocusChangeListener() {

                    @Override
                    public void onFocusChange(View v, boolean hasFocus) {
                        if (hasFocus) {
                            DialogFragment newFragment = new TimePickerFragment();
                            newFragment.show(getSupportFragmentManager(),
                                    "timePicker");
                        }
                    }
                });

hasFocus変数は、現在のEditTextにフォーカスがあるかどうかを制御します。

1
noloman