如何将我在 EditText 框中键入的数据添加到数组中以在另一个活动中列出?
Posted
技术标签:
【中文标题】如何将我在 EditText 框中键入的数据添加到数组中以在另一个活动中列出?【英文标题】:How do I add data I have keyed in a EditText box into an array to list in another activity? 【发布时间】:2017-07-15 17:07:27 【问题描述】:以下是我用于 android 应用程序开发的 3 个 java 类。单击“添加”后,我想将 AddActivity 中的学生数据(姓名和电话号码)添加到 MainActivity 页面中。我对此进行了研究并尝试使用数组。但是我对代码必须如何将在 AddActivity 中键入的数据发送到 MainActivity 页面的逻辑感到非常困惑。谁能给我一个关于如何解决这个问题的指导,如果你能告诉我另一种方式而不是我正在尝试的方式,我将不胜感激。在我在 AddActivity 页面中单击每个“添加”之后,我希望数据以 ListView 格式存储在 MainActivity 中。我确实希望有人能够指导我这样做。谢谢。
MainActivity.java - https://jsfiddle.net/eb1fprnn/
public class MainActivity extends AppCompatActivity
ListView listView;
Button addStudent;
ArrayList<Student> students = new ArrayList<Student>();
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
add();
public void add()
Student student;
addStudent = (Button) findViewById(R.id.add);
addStudent.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
Intent intent = new Intent(MainActivity.this, AddActivity.class);
startActivity(intent);
);
AddActivity.java - https://jsfiddle.net/40k5mas2/
public class AddActivity extends AppCompatActivity
EditText name, phone;
Button add;
int FphoneNumber;
String Fname;
ArrayList<Student> students;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
Intent intent = getIntent();
students = (ArrayList<Student>) getIntent().getSerializableExtra("AddNewStudent");
setContentView(R.layout.activity_add);
edit();
addStudent();
public void edit()
name = (EditText) findViewById(R.id.StudentName);
phone = (EditText) findViewById(R.id.phone);
final Button addStudent = (Button) findViewById(R.id.AddStudent);
name.addTextChangedListener(new TextWatcher()
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after)
@Override
public void onTextChanged(CharSequence s, int start, int before, int count)
addStudent.setEnabled(!name.getText().toString().trim().isEmpty());
Fname = name.getText().toString();
String phoneNumber = phone.getText().toString();
FphoneNumber = Integer.parseInt(phoneNumber);
@Override
public void afterTextChanged(Editable s)
);
public void addStudent()
add = (Button) findViewById(R.id.AddStudent);
add.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
Intent intent = new Intent(AddActivity.this, MainActivity.class);
intent.putExtra("studentName",name.getText().toString() );
intent.putExtra("phoneNumber",phone.getText().toString());
startActivity(intent);
Student student = new Student(Fname, FphoneNumber);
students.add(student);
);
public void addStudent()
add = (Button) findViewById(R.id.AddStudent);
add.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
Intent intent = new Intent(AddActivity.this,Record.class);
startActivity(intent);
);
学生.java - https://jsfiddle.net/gy0g7b0s/
public class Student
String mName;
int mPhoneNumber;
public Student (String name, int number)
mName = name;
mPhoneNumber = number;
;
public String getmName()
return mName;
public String getmName(String newName)
return (this.mName = newName);
public int getmPhoneNumber()
return this.mPhoneNumber;
public int getmPhoneNumber(int newPhoneNumber)
return (this.mPhoneNumber = newPhoneNumber);
@Override
public String toString()
return String.format("%s\t%f",this.mName, this.mPhoneNumber);
[1] : [主活动页面图片] http://imgur.com/a/pMWt4
[2] : [添加活动页面的图片] http://imgur.com/a/8YvVc
【问题讨论】:
我建议使用数据库。 我建议您在这两个活动之间共享一个数组列表,并在 AddActivity 中相应地更新数组列表。更新数组列表后,在 MainActivity 的 onResume() 方法中使用该数组列表设置列表视图的适配器 如何打开您的 AddActivity? @Code-Apprentice 我不打算使用数据库。 @Dhruvam Gupta 你好,你能告诉我如何通过编辑我的代码来做到这一点吗?我真的不知道如何开始。 【参考方案1】:如上所述,正确的方法是使用startActivityForResult
方法。 Check this。
以及如何去做,该死的容易! 修改代码:
public void add()
Student student;
addStudent = (Button) findViewById(R.id.add);
addStudent.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
Intent intent = new Intent(MainActivity.this, AddActivity.class);
startActivityForResult(intent,123);
);
并在同一个活动(MainActivity)中监听结果 还建议您使用 parceler.org 库来发送对象
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
super.onActivityResult(requestCode, resultCode, data);
if (resultCode== Activity.RESULT_OK && requestCode==123)
// perform your list addition operation here and notify the adapter for change
// the returned data comes in 'data' parameter and would recommend you to use parcels.org lib
// for sending parcelable pojo across activities and fragments.
list.add(Parcels.unwrap(data.getParcelableArrayExtra(YOUR_KEY)));
adapter.notifyDataSetChanged();
在您的 AddActivity 中,当您添加时,只需执行此操作。
public void addStudent()
// add the 'add' button view to the oncreatemethod
// add = (Button) findViewById(R.id.AddStudent);
add.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
// Do not restart the activity that opened this activty
// this activity is anyways on top of the MainActivity. Just finish this activty setting the result
// Intent intent = new Intent(AddActivity.this, MainActivity.class);
// intent.putExtra("studentName",name.getText().toString() );
// intent.putExtra("phoneNumber",phone.getText().toString());
// startActivity(intent);
// How to do that?
Student student = new Student(Fname, FphoneNumber);
Intent intent = new Intent();
intent.putExtra(YOUR_KEY, Parcels.wrap(student));
// you can also do it without the parcels lib
// intent.putExtra("studentName",name.getText().toString() );
// intent.putExtra("phoneNumber",phone.getText().toString());
setResult(123,intent); // set the result code. it should be the same one as the one your listening on in MainAcitivty
// then just finish this activity.
finish();
// this calls the onActivtyResultMethod in MainActivity which furtther does the logic
// students.add(student);
);
应该可以!干杯!
【讨论】:
您好 if (resultCode== Activity.RESULT_OK && requestCode==123) “Activity”指的是什么?另外, list.add(Parcels.unwrap(data.getParcelableArrayExtra(YOUR_KEY)));适配器.notifyDataSetChanged();为什么“list”、“Parcels”和“adapter”都是红色的?无法解析符号。 你有teamviewer来帮我吗? :) list 和其他变量是红色的,因为这些变量可能未定义,这里的列表将是您用于在 ListView(或 RecyclerView)中显示内容的最终列表,Parcels 是一个库,其中您可以选择添加到您的项目中。 Adapter 是将数据绑定到 RecyclerView 的类,如果你有的话。而 Activty.RESULT_OK 是静态变量。您不必担心它是什么活动。 抱歉可以帮助您使用teamviewer,您可能需要自己弄清楚基本列表和适配器的东西。 Here's a good guide【参考方案2】:将 StartActivityForResult 用于 AddActivity 并从此处返回对象并在 MainActivity 中使用。例如see here
【讨论】:
你好,你能帮我编辑一下代码,告诉我你是怎么做的,因为我真的不知道如何开始...... 见这里link 仅链接的答案通常是 Stack Overflow 上的 frowned upon。随着时间的推移,链接可能会萎缩并变得不可用,这意味着您的答案将来对用户毫无用处。如果您可以在实际帖子中提供答案的一般详细信息,并引用您的链接作为参考,那将是最好的。【参考方案3】:由于您将数据存储在文件中,添加活动应该只是将数据写入文件。那么主要活动应该总是读取文件以刷新列表。
【讨论】:
你有一些链接供我参考吗? :)【参考方案4】:如果您不想使用数据库,我建议您使用静态类。 或者,如果您应该使用文件,则在下一个活动中添加和读取文件时写入文件非常简单。
只需像这样创建一个静态类。
public static class MyStaticClass
private static ArrayList <Student> mStudents = new ArrayList<Student>()
public static void addStudent(Student theNewStudent)
mSudents.add(theNewStudent);
public static List<Student> getStudents()
return mStudents;
或使用文件:
public static class MyFileClass
private static String pathFile = "Your path";
public static void addStudent(Student theNewStudent)
File file = new OutputStreamWriter(new FileOutputStream(pathFile,true)); //the true is to append to the file
file.write(/*parse your student as a string*/);
file.close();
public static List<Student> getStudents()
ArrayList<Student> students = new ArrayList<>()
File file = new File(pathFile);
Scanner sc = new Scanner(file);
while (sc.hasNextLine())
String line = sc.nextLine();
//parse your line to a student object
students.add(yourNewStudent);
sc.close();
return students;
只需调用 add student 和 get students in the proper class,如下所示。
MyStaticClass.addStudent(student);
或
MyFileClass.addStudent(student);
希望对您有所帮助。 在你的 onclick 监听器中:
public void onClick(View v)
Intent intent = new Intent(AddActivity.this, MainActivity.class);
Student student = new Student(Fname, FphoneNumber);
MyStaticClass.addStudent(student); // or the FileClass
startActivity(intent);
我看不到你在哪里检索列表。但只需使用班级的 getStudents。
【讨论】:
我该怎么做? 您好,我想通过带有 EditText 框的添加按钮添加学生。这对他们有用吗? 是的,应该。当你想添加而不是把它当作额外的东西时,只需使用 add 方法。当您需要列表时,只需通过 get 方法获取它。 嗯,介意为我编辑 jsfiddle 中的代码吗?我真的不知道该换哪一个。 好的,我试试看!如果有任何问题,我会再次通知您。谢谢! :)【参考方案5】:Intent yourFirstAct= new Intent(firstAct.this,second.class);
yourFirstAct.putExtra("","");
startActivitForResult(yourFirstAct);
在第一个活动中,
@Override
public void onAcitivityResult(....)
super();
在您完成后的第二个活动中, 在第二个活动中做任何你想做的事情。并将其传递给 mainActivity
Intent yoursecAct= new Intent();
yourSecAct.putExtra("","");
setResult(yourSecAct);
finish();
如果您在片段中使用
如果你在片段中执行 startActivityResult() 意味着,
您的片段 mainActivity 必须返回 super() in
public void onAcitivityResult(...)super()
【讨论】:
【参考方案6】:从学生那里获得详细信息后,将各自的详细信息打包,然后使用意图返回主要活动。然后使用捆绑包来提取主要活动中的数据。
【讨论】:
【参考方案7】:您也可以使用 startActivityForResult 。如果您还没有找到答案,请告诉我。我会给你代码。
上面的许多答案已经很好地定义了这个东西。
【讨论】:
【参考方案8】:这是关于活动之间的通信。您可以使用事件总线来实现这一点。 https://github.com/JackZhangqj/EventBus
然后 1. 将事件总线依赖添加到 App 的 build.grade
compile "de.greenrobot:eventbus:3.0.0
在 MainActivity.java 中注册和注销您的订阅
@覆盖 受保护的无效 onStart() super.onStart(); EventBus.getDefault().register(this);
@覆盖 受保护的无效 onStop() 超级.onStop(); EventBus.getDefault().unregister(this);
3.AddActivity.java中的Post事件
EventBus.getDefault().post(new Student(name.getText().toString(), phone.getText().toString()));
4.MainActivity中实现事件处理方法
//The student is the added student in the AddActivity.java
public void onEventMainThread(Student student)
【讨论】:
【参考方案9】:为了稍微扩展一下 MadScientist 的回答,ListView 需要适配器才能在其视图中设置数据。您需要为列表视图定义一个 ArrayAdapter 以与之通信。这将需要进入您的MainActivity
,并将在onCreate
方法中进行初始化。假设您要显示这两种类型的信息,您需要使用内置布局构建适配器,以便通过android.R.layout.simple_list_item_2
显示两个项目。但是,如果您想创建自己的布局,可以查看如何做到这一点here。
public class MainActivity extends AppCompatActivity
Button addStudent;
ArrayAdapter<Student> adapter;
ArrayList<Student> students = new ArrayList<Student>();
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_2, students);
ListView listView = (ListView) findViewById(R.id.listView);
listView.addAdapter(adapter);
add();
在您的 Listener 中调用 startActivityForResult(intent, 123)
以启动新活动。然后,在您输入数据后,将您的项目添加到意图并在您的AddActivity
中调用finish()
。覆盖 onActivityResult
中的 MainActivity
以将项目从您的意图中拉出并将它们添加到您的列表中。最后,通过adapter.notifyDataSetChanged()
通知适配器更改
【讨论】:
以上是关于如何将我在 EditText 框中键入的数据添加到数组中以在另一个活动中列出?的主要内容,如果未能解决你的问题,请参考以下文章