如何将我在 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 框中键入的数据添加到数组中以在另一个活动中列出?的主要内容,如果未能解决你的问题,请参考以下文章

EditText ,希望将键入的文本显示为星号 ' * '

实时编辑用户输入

实时编辑用户输入

使用 EditText 过滤 SimpleCursorAdapter 支持的 ListView

如何在 EditText 框中获取指定的产品名称?

如何在 EditText 中自动添加千位分隔符?