这是ViewActivity
public class ViewActivity extends AppCompatActivity {
private ListView lvPerson;
private PersonListAdapter adapter;
public List<Person> mPersonList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view);
lvPerson = (ListView)findViewById(R.id.listView);
//Add new person
Intent intent = getIntent();
if(intent.hasExtra("add")){
String name = intent.getStringExtra("name");
String email = intent.getStringExtra("email");
String address = intent.getStringExtra("address");
mPersonList.add(new Person(name, email, address));
Toast.makeText(getApplicationContext(), "Data berhasil ditambahkan", Toast.LENGTH_SHORT).show();
}
//Init adapter
adapter = new PersonListAdapter(getApplicationContext(), mPersonList);
lvPerson.setAdapter(adapter);
}
}
这是InputActivity
public class InputActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_input);
}
public void saveButtonClicked(View view){
EditText name = (EditText) findViewById(R.id.editTextName);
EditText email = (EditText) findViewById(R.id.editTextEmail);
EditText address = (EditText) findViewById(R.id.editTextAddress);
String strName = name.getText().toString();
String strEmail = email.getText().toString();
String strAddress = address.getText().toString();
Intent intent = new Intent(this, ViewActivity.class);
intent.putExtra("add", true);
intent.putExtra("name", strName);
intent.putExtra("email", strEmail);
intent.putExtra("address", strAddress);
startActivity(intent);
}
}
显示我的流程是在InputActivity中单击保存按钮时,它将在ViewActivity中运行“添加人”代码,并将数据从表单添加到ArrayList。
这是可行的,但是当我使用Intent更改活动并回到ViewActivity时,ArrayList数据消失了。
我想要的是保留我已经在InputActivity中输入的所有值。
希望你明白我的意思:)
答案 0 :(得分:2)
在InputActivity中覆盖onSaveInstanceState(Bundle)以保存所需的任何数据,然后在同一活动中覆盖onRestoreInstanceState(Bundle)以取回值。使用捆绑软件,您可以存储几乎任何所需的数据。我建议这样的东西:
public class ViewActivity extends AppCompatActivity {
private ListView lvPerson;
private PersonListAdapter adapter;
public List<Person> mPersonList = new ArrayList<>();
@Override
protected void onSaveInstanceState (Bundle outState) {
outState.putStringArrayList("mPersonList", mPersonList); //I assume you want to mPersonList
}
@Override
protected void onRestoreInstanceState (Bundle savedInstanceState) {
this.mPersonList = savedInstanceState.getStringArrayList("mPersonList"); //on coming back retrieve all values using key
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view);
lvPerson = (ListView)findViewById(R.id.listView);
//Add new person
Intent intent = getIntent();
if(intent.hasExtra("add")){
String name = intent.getStringExtra("name");
String email = intent.getStringExtra("email");
String address = intent.getStringExtra("address");
mPersonList.add(new Person(name, email, address));
Toast.makeText(getApplicationContext(), "Data berhasil ditambahkan", Toast.LENGTH_SHORT).show();
}
//Init adapter
adapter = new PersonListAdapter(getApplicationContext(), mPersonList);
lvPerson.setAdapter(adapter);
}
}
答案 1 :(得分:2)
您正在做的事情实际上非常糟糕,因为您只是为要添加和创建的每个人员创建一个接一个的活动。浪费内存和功率。
相反,您应该寻找的仅仅是将InputActivity的结果返回给ViewActivity。
在您的ViewActivity中,不要调用startActivity(intent)
,而要使用startActivityForResult(intent, REQUEST_CODE)
。然后覆盖onActivityResult()
,以便您可以处理返回到ViewActivity的结果。
在InputActivity中,不要调用startActivity()
,而是将意图返回给ViewActivity。
一个例子如下:
ViewActivity
public class ViewActivity extends AppCompatActivity {
private ListView lvPerson;
private PersonListAdapter adapter;
public List<Person> mPersonList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view);
lvPerson = (ListView)findViewById(R.id.listView);
//Init adapter
adapter = new PersonListAdapter(getApplicationContext(), mPersonList);
lvPerson.setAdapter(adapter);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(resultCode == RESULT_OK){
String name = data.getStringExtra("name");
String email = data.getStringExtra("email");
String address = data.getStringExtra("address");
mPersonList.add(new Person(name, email, address));
adapter.notifyDataSetChanged();
Toast.makeText(getApplicationContext(), "Data berhasil ditambahkan", Toast.LENGTH_SHORT).show();
}
}
}
InputActivity
public class InputActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_input);
}
public void saveButtonClicked(View view){
EditText name = (EditText) findViewById(R.id.editTextName);
EditText email = (EditText) findViewById(R.id.editTextEmail);
EditText address = (EditText) findViewById(R.id.editTextAddress);
String strName = name.getText().toString();
String strEmail = email.getText().toString();
String strAddress = address.getText().toString();
Intent intent = new Intent();
intent.putExtra("add", true);
intent.putExtra("name", strName);
intent.putExtra("email", strEmail);
intent.putExtra("address", strAddress);
setResult(RESULT_OK, intent);
finish();
}
}
以这种方式进行操作可避免再次创建ViewActivity,因此您不必重新创建所有视图并重新填充列表。您只需重复使用现有的ViewActivity并将结果添加到现有列表即可。
答案 2 :(得分:2)
这里有一些很好的答案,但是由于您只希望它在一个应用会话中持续存在,因此我将添加另一种方法,即使用单例来保存数据:
class DataHolder {
final List<Person> people = new ArrayList<>;
private DataHolder() {}
static DataHolder getInstance() {
if( instance == null ) {
instance = new DataHolder();
}
return instance;
}
private static DataHolder instance;
}
在任一活动(或应用程序中的任何位置)中,您都可以使用
访问人员列表List<Person> ppl = DataHolder.getInstance().people;
例如,您将替换
public List<Person> mPersonList = new ArrayList<>();
使用
// not sure why that was public...
private List<Person> mPersonList = DataHolder.getInstance().people;
它只会在您当前的应用会话中持续,但是如果您以后想保存它们,可以在DataHolder中添加一个后端数据库,这样每次添加一个人时,它都会自动保存在某个地方。
答案 3 :(得分:1)
如果我对您的理解正确,那么您的流程如下: 1.)ViewActivity->意向-> InputActivity 2.)InputActivity->意向-> ViewActivity
在这种情况下,您应该阅读有关Android中“活动生命周期”的更多信息: https://developer.android.com/guide/components/activities/activity-lifecycle
简而言之: onCreate仅在创建ViewActivity时被调用。如果从那里转到InputActivity,然后返回-> ViewActivity已经存在,因此不会调用oncreate。
我想到的一个解决方案是startActivityForResult。以下是有关如何使用它的示例: How to manage `startActivityForResult` on Android?
另一个一般性提示,似乎您对android开发还相当陌生:大量使用断点和Log(https://developer.android.com/reference/android/util/Log)可以更好地了解发生事情的地点和时间。并且不仅要使用教程来开始在Android中进行开发。阅读一些初学者指南/书并没有什么害处,该指南/书更详细地说明了一些Android细节(例如Activity-Lifecycle)
答案 4 :(得分:0)
您可以使用Gson / Jackson /或其他任何东西将其序列化为字符串,然后使用[SharedPreferences][1]
保存。然后在新活动中,您只需将其从SharedPreferences
重新加载。