Как я могу получить строку в список массивов из другого действия? - PullRequest
0 голосов
/ 09 июля 2020

Я делаю приложение типа «To-do» и пытаюсь заставить пользователя написать задачу To-do в другом действии, отличном от основного. Проблема в том, что я новичок в android и не могу найти ошибку. Приложение запускается, произносит тост (который я написал для подтверждения добавления новой задачи) и закрывается.

ГЛАВНЫЙ КОД АКТИВНОСТИ:

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

private Button addBtn;
private ListView listaTarefas;

private ArrayList<String> tarefas;                      // Onde se guardam as tarefas enquanto a app está aberta
private ArrayAdapter<String> adapter;                   // Uma ferramenta que ajuda o android a prencher a lista

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

    addBtn = findViewById(R.id.addBtn);
    listaTarefas = findViewById(R.id.listaTarefas);

    tarefas = FileHelper.lerData(this);

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

    addBtn.setOnClickListener(this);

    listaTarefas.setOnItemClickListener(this);

    String tarefa = getIntent().getStringExtra("tarefa_key");
    adapter.add(tarefa);

    FileHelper.escreveData(tarefas, this);

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

}

@Override
public void onClick(View view) {
    openAdd();
}


private void openAdd() {
    Intent intent = new Intent(this, addActivity.class);
    startActivity(intent);
}

@Override
public void onItemClick(AdapterView<?> adapterView, View view, int posicao, long l) {
    tarefas.remove(posicao);
    adapter.notifyDataSetChanged();
    FileHelper.escreveData(tarefas, this);
    Toast.makeText(this, "Tarefa Eliminada", Toast.LENGTH_SHORT).show();
}

}

ВТОРОЙ КОД ДЕЯТЕЛЬНОСТИ:

public class addActivity extends AppCompatActivity {

private EditText tarefasEdit;
private Button backBtn;

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

    tarefasEdit = findViewById(R.id.tarefasEdit);
    backBtn = findViewById(R.id.backBtn);

    backBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            switch (view.getId()) {
                case R.id.backBtn:
                Intent intent = new Intent(addActivity.this, MainActivity.class);
                String tarefa = tarefasEdit.getText().toString();
                intent.putExtra("tarefa_key", tarefa);
                startActivity(intent);
                tarefasEdit.setText("");
                break;
            }
        }
    });

}

}

КОД ФАЙЛА ДЛЯ СОХРАНЕНИЯ ДАННЫХ:

public class FileHelper {
public static final String FILENAME = "listadetarefas.dat";

public static void escreveData(ArrayList<String> tarefas, Context context){
    try {
        FileOutputStream fos = context.openFileOutput(FILENAME, Context.MODE_PRIVATE);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(tarefas);
        oos.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

public static  ArrayList<String> lerData(Context context){
    ArrayList<String> listaTarefas = null;
    try {
        FileInputStream fis = context.openFileInput(FILENAME);
        ObjectInputStream ois = new ObjectInputStream(fis);
        listaTarefas = (ArrayList<String>) ois.readObject();
    } catch (FileNotFoundException e) {
        listaTarefas = new ArrayList<>();
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }

    return listaTarefas;
}

}

ОШИБКА LOGCAT:

ошибка logcat

Мы будем очень благодарны за любую помощь, так как вы будете для меня как учитель.

Я ЭТО ПОКАЗАЛ!

Мне нужна была только одна защита, не на addActivity, а на основном, когда я вызываю добавить задачу

Ответы [ 2 ]

1 голос
/ 10 июля 2020

Насколько я понимаю, вы сначала запускаете свою MainActivity. В этом сценарии getIntent().getStringExtra("tarefa_key"); имеет значение null, и поэтому его нельзя преобразовать в String. Вы можете изменить его на это:

if(getIntent().getStringExtra("tarefa_key")!=null){

   String tarefa = getIntent().getStringExtra("tarefa_key");
   adapter.add(tarefa);

}

Таким образом, только если в вашем намерении есть дополнительная строка «tarefa_key», она добавится в ваш адаптер. Кроме того, я не уверен, какого поведения вы ожидаете, но я думаю, вы могли бы взглянуть на startActivityForResult, чтобы вы могли запустить свой secondActivity, и как только вы получите желаемый результат, вы можете go вернуться к своей основной деятельности. Я думаю, что это более чистый способ сделать это.

надеюсь, что это поможет :)

0 голосов
/ 10 июля 2020

Замените на это:

 backBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            switch (view.getId()) {
                case R.id.backBtn:
                Intent intent = new Intent(addActivity.this, MainActivity.class);
                if(tarefasEdit.getText()!=null){
                       intent.putExtra("tarefa_key", tarefasEdit.getText().toString());
                }else{
                       intent.putExtra("tarefa_key", "");
                }
               
                startActivity(intent);
                tarefasEdit.setText("");
                break;
            }
        }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...