Код ломается при создании AlertDialog. Я думаю, что у меня неправильный контекст?

я не могу понять, почему мое приложение/код дает сбой в этом разделе. Любая помощь будет оценена по достоинству. Я думаю, что проблема заключается в создании AlertDialog в операторе else if.

По сути, этот метод вызывается при первом запуске приложения и предлагает пользователю выбрать один из двух вариантов: OCPS и Другое. При выборе OCPS устанавливается SharedPreference. Когда выбрано другое, должно появиться всплывающее окно AlertDialog с текстовым полем, позволяющее пользователю ввести свой собственный локальный URL-адрес, который затем сохраняется в SharedPreference.

Полный код доступен здесь: https://github.com/danielblakes/progressbook/

код следует:

public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    boolean firstrun = getSharedPreferences(
            "com.danielblakes.progressbook", MODE_PRIVATE).getBoolean(
            "firstrun", true);
    if (firstrun) {
        new AlertDialog.Builder(this).setTitle("First Run").show();
        pickDistrict(this);
        getSharedPreferences("com.danielblakes.progressbook", MODE_PRIVATE)
                .edit().putBoolean("firstrun", false).commit();
    }

    else {
        String saved_district = getSharedPreferences(
                "com.danielblakes.progressbook", MODE_PRIVATE).getString(
                "district", null);
        startupWebView(saved_district);
    }
}

public Dialog pickDistrict(final Context context) {
    AlertDialog.Builder districtalert = new AlertDialog.Builder(context);
    districtalert
            .setTitle(R.string.choose_district)
            .setItems(R.array.districts,
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int i) {
                            if (i == 0) {
                                String district_site = "https://parentaccess.ocps.net/General/District.aspx?From=Global";
                                startupWebView(district_site);
                                getSharedPreferences(
                                        "com.danielblakes.progressbook",
                                        MODE_PRIVATE)
                                        .edit()
                                        .putString("district",
                                                district_site).commit();
                            } else if (i == 1) {
                                AlertDialog.Builder customdistrict = new AlertDialog.Builder(context);
                                customdistrict
                                        .setTitle(
                                                R.string.custom_district_title)
                                        .setMessage(
                                                R.string.custom_district_message);
                                final EditText input = new EditText(
                                        getParent());
                                customdistrict.setView(input);
                                customdistrict
                                        .setPositiveButton(
                                                "Ok",
                                                new DialogInterface.OnClickListener() {
                                                    public void onClick(
                                                            DialogInterface dialog,
                                                            int which) {
                                                        String custom_url = input
                                                                .getText()
                                                                .toString();
                                                        getSharedPreferences(
                                                                "com.danielblakes.progressbook",
                                                                MODE_PRIVATE)
                                                                .edit()
                                                                .putString(
                                                                        "district",
                                                                        custom_url)
                                                                .commit();
                                                    }
                                                });
                                customdistrict
                                        .setNegativeButton(
                                                "Cancel",
                                                new DialogInterface.OnClickListener() {
                                                    public void onClick(
                                                            DialogInterface dialog,
                                                            int which) {
                                                        return;
                                                    }
                                                }).show();
                            }
                        }
                    }).show();
    return districtalert.create();
}

}


person danielblakes    schedule 15.03.2013    source источник


Ответы (1)


Изменять

AlertDialog.Builder customdistrict = new AlertDialog.Builder(this);  

to

AlertDialog.Builder customdistrict = new AlertDialog.Builder(context);

также,

final EditText input = new EditText(getParent());

нужно было изменить на

final EditText input = new EditText(context);
person Hoan Nguyen    schedule 15.03.2013
comment
Когда я делаю это, я получаю сообщение об ошибке Не могу ссылаться на неконечный контекст переменной внутри внутреннего класса, определенного другим методом, и если я изменяю контекст на конечную переменную, он все равно падает таким же образом. Кроме того, контекст, передаваемый в диалоговое окно pickDistrict, является именно таким. Полный код github.com/danielblakes/progressbook - person danielblakes; 15.03.2013
comment
Изменить открытый диалог pickDistrict (конечный контекст контекста) - person Hoan Nguyen; 15.03.2013
comment
@HoanNguyen Я сделал это, но он все еще падает. Я обновил исходный пост с вашим предложением. - person danielblakes; 15.03.2013
comment
Причина в stackoverflow.com/questions/7846518/ - person Hoan Nguyen; 15.03.2013
comment
Я запустил ваше приложение. В этой строке не выполняется окончательный ввод EditText = new EditText(getParent()); Используйте контекст вместо getParent(), это та же проблема, что и @HoanNguyen, упомянутая ранее. - person cwhsu; 15.03.2013
comment
ах! я даже не понял, что снова сослался на getParent(). Большое спасибо @HoanNguyen и @cwhsu! - person danielblakes; 15.03.2013