Я не могу использовать setOnClickListener с Custom Dialog - PullRequest
0 голосов
/ 09 сентября 2018

Я создаю OptionActivity и меню для открытия имени настраиваемого диалога dlg_option . В диалоге dlg_option у меня есть TextView id txt_time для открытых календарей.

Это вариант активности

public class OptionActivity extends AppCompatActivity {

    private TextView mDisplayDate;
    private DatePickerDialog.OnDateSetListener mDateSetListener;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_m_option);

        /************** This is open claenda code ************/
        mDisplayDate = (TextView) findViewById(R.id.txt_time);
        mDisplayDate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Calendar cal = Calendar.getInstance();
                int year = cal.get(Calendar.YEAR);
                int month = cal.get(Calendar.MONTH);
                int day = cal.get(Calendar.DAY_OF_MONTH);

                DatePickerDialog dialog = new DatePickerDialog(OptionActivity.this,
                        android.R.style.Theme_DeviceDefault_Dialog_MinWidth,
                        mDateSetListener,
                        year, month, day);

                dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
                dialog.show();

            }
        });

        mDateSetListener = new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {

                month = month + 1;
                String date = dayOfMonth + "/" + month + "/" + year;
                mDisplayDate.setText(date);
            }
        };
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.m_menu, menu);
        return super.onCreateOptionsMenu(menu);
    }

    /************ This is menu ****************/
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        LayoutInflater inflater = this.getLayoutInflater();

        switch (item.getItemId()){
            case  R.id.m_menu1:

                builder.setView(inflater.inflate(R.layout.dlg_option, null));
                builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                Toast.makeText(OptionActivity.this, "menu ok",
                                        Toast.LENGTH_SHORT).show();
                            }
                        })
                        .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                Toast.makeText(OptionActivity.this, "menu cancel",
                                        Toast.LENGTH_SHORT).show();
                                dialogInterface.dismiss();

                            }
                        }).show();

                return true;

        }

        return super.onOptionsItemSelected(item);
    }
}

Это показывает ошибку java.lang.NullPointerException

когда я нажимаю m_menu1, он должен показывать dlg_option, а когда я нажимаю txt_time в dlg_option, он должен показывать календарь на выбранную дату. Как это исправить?

1 Ответ

0 голосов
/ 10 сентября 2018

Если ваше представление txt_time находится в вашем диалоговом окне, а не в обычном макете вашей деятельности, вы не сможете найти его, вызвав findViewById() в методе onCreate () своей деятельности. Вместо этого вы должны найти его при создании диалога.

В точке, где вы устанавливаете диалоговое окно:

builder.setView(inflater.inflate(R.layout.dlg_option, null));

Вам нужно извлечь inflate() вызов локальной переменной, а затем использовать findViewById() здесь.

View dialogBody = inflater.inflate(R.layout.dlg_option, null);
mDisplayDate = (TextView) dialogBody.findViewById(R.id.txt_time);
mDisplayDate.setOnClickListener(new View.OnClickListener() {
    ...
});
builder.setView(dialogBody);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...