Java 如何从其他活动获取数组列表中的字符串?

Java 如何从其他活动获取数组列表中的字符串?,java,android,android-studio,Java,Android,Android Studio,我正在制作一个“待办”类型的应用程序,我试图让用户在不同的活动中编写待办任务,然后是主活动。问题是我对安卓系统还很陌生,似乎找不到错误。该应用程序启动、敬酒(我写这封信是为了确认添加了一项新任务),然后关闭 主要活动代码: public class MainActivity extends AppCompatActivity implements View.OnClickListener, AdapterView.OnItemClickListener { private Button add

我正在制作一个“待办”类型的应用程序,我试图让用户在不同的活动中编写待办任务,然后是主活动。问题是我对安卓系统还很陌生,似乎找不到错误。该应用程序启动、敬酒(我写这封信是为了确认添加了一项新任务),然后关闭

主要活动代码:

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

}
}

用于保存数据的FILEHELPER代码:

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;
}
公共类FileHelper{
公共静态最终字符串FILENAME=“listadetarefas.dat”;
公共静态void escreveData(ArrayList tarefas,上下文){
试一试{
FileOutputStream fos=context.openFileOutput(文件名,context.MODE\u PRIVATE);
ObjectOutputStream oos=新的ObjectOutputStream(fos);
oos.writeObject(tarefas);
oos.close();
}catch(filenotfounde异常){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
}
公共静态ArrayList数据(上下文){
ArrayList listaTarefas=null;
试一试{
FileInputStream fis=context.openFileInput(文件名);
ObjectInputStream ois=新ObjectInputStream(fis);
listaTarefas=(ArrayList)ois.readObject();
}catch(filenotfounde异常){
listaTarefas=newarraylist();
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}catch(classnotfounde异常){
e、 printStackTrace();
}
返回ListAtarFas;
}
}

LOGCAT错误:

任何帮助都将非常感激,因为你对我来说就像一个老师

我知道了


我只需要一个保护,不是在addActivity上,而是在main上。当我调用添加任务时,我可以看到,您首先启动了MainActivity。在这个场景中,
getIntent().getStringExtra(“tarefa_键”)
为空,这就是为什么不能将其转换为字符串。您可以将其更改为:

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

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

}
这样,只有当您的意图具有字符串额外的“tarefa_key”时,它才会将其添加到适配器中。此外,我不确定您期望的行为是什么,但我认为您可以查看startActivityForResult,这样您就可以开始第二项活动,一旦您获得想要的结果,您就可以返回您的主要活动。我认为这是一种更干净的方法

希望有帮助:)

更改为:

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

发布您从logcat获得的错误,以便我们可以帮助调试崩溃。我想就是这样,还是您想要以下所有“at…”语句?我做了您告诉我的保护,但它保持不变,我只能在一个活动中完成,并且已经完成了,但是,每当我尝试添加一个活动时,它都会分为多个部分。错误保持不变,在logcat上有相同的错误。我只用了一个活动就制作了基本相同的应用程序,我可以告诉你,如果你想在房间里聊天,请加入这里