При создании AlertDialog переменные не отображаются определенными - PullRequest
0 голосов
/ 19 июня 2020

У меня проблемы с моим первым приложением (изучаю android studio как i go), я пытаюсь вставить диалоговое окно с предупреждением всякий раз, когда пользователь нажимает на элемент списка, чтобы убедиться, что он хочет удалить пункт. Однако я не могу заставить его работать, вот код, если вам нужно больше, просто попросите его. О, я, кстати, португальский, так что не запутайтесь с переменными.

public class MainActivity extends AppCompatActivity implements View.OnClickListener, AdapterView.OnItemClickListener {

private EditText tarefasET;
private Button btn;
private ListView tarefasList;

private ArrayList<String> tarefas;
private ArrayAdapter<String> adapt;

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

    tarefasET = findViewById(R.id.todoEditText);
    btn = findViewById(R.id.addBtn);
    tarefasList = findViewById(R.id.lvTarefas);

    tarefas = FileHelper.lerData(this);

    adapt = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, tarefas);
    tarefasList.setAdapter(adapt);

    btn.setOnClickListener(this);
    tarefasList.setOnItemClickListener(this);

}

@Override
public void onClick(View view) {
    switch(view.getId()){
        case R.id.addBtn:
            String newTarefa = tarefasET.getText().toString();
            adapt.add(newTarefa);
            tarefasET.setText("");

            FileHelper.escreve(tarefas, this);

            Toast.makeText(this, "Tarefa Adicionada", Toast.LENGTH_SHORT).show();

            break;
    }
}

@Override
public void onItemClick(AdapterView<?> adapterView, View view, int posicao, long id) {
    AlertDialog confirmDialog = new AlertDialog.Builder(this)
            .setTitle("Confirmação")
            .setMessage("De certeza que pretende eliminar a tarefa?")
            .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    tarefas.remove(posicao);
                    adapt.notifyDataSetChanged();
                    FileHelper.escreve(tarefas, this);
                    Toast.makeText(this, "Tarefa Eliminada", Toast.LENGTH_SHORT).show();

                }
            })
            .setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {

                }
            })
            .setIcon(android.R.drawable.ic_dialog_alert)
            .show();

}

}

Что я могу сделать? Приложение должно быть списком дел, и я уже могу добавлять и удалять файлы. Но я хотел сделать диалоговое окно подтверждения, когда пользователь решит удалить элемент, который ему нужно сделать. Но код дает мне следующую ошибку, когда я пытаюсь запустить приложение в эмуляторе.

ошибка, которую я получаю

1 Ответ

0 голосов
/ 19 июня 2020

Я полагаю, вы пытаетесь ссылаться на свой класс активности через переменную this. Используйте имя класса перед ключевым словом this, чтобы получить внешнюю ссылку:

    FileHelper.escreve(tarefas, MainActivity.this);

Почему возникает проблема?

Из-за области действия переменной . Те же правила применяются к ключевому слову this. Представьте это как конечную переменную по умолчанию, определяемую для вас языком.

В вашем конкретном случае ключевое слово this ссылается на созданный вами экземпляр DialogInterface.OnClickListener. Та же проблема возникнет в случае, если любое из имен переменных уровня класса MainActivity будет иметь sh с именем переменной переменной уровня метода, определенной в onClick:

new DialogInterface.OnClickListener() {
                @Override
    public void onClick(DialogInterface dialogInterface, int i) {
        ArrayList<String> tarefas = new ArrayList();
        ArrayList<String> outerTarefas = MainActivity.this.tarefas; // not just tarefas or this.tarefas
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...