【问题标题】:Adding new ListView item and get value of item from another activity添加新的 ListView 项目并从另一个活动中获取项目的值
【发布时间】:2023-03-05 23:15:01
【问题描述】:

我正在尝试使用 Android Studio 制作“新闻应用”。我的主要活动有ListViewfloating button。在我的第二个活动中,我得到了two TextViewstwo EditViewsone Button。我想做的是以下几点: 首先,我在我的主要活动中按下floating Button。然后应该弹出第二个活动,我在two EditText's 上写,然后按button。之后我应该回到主要活动,在那里,一个新的项目应该被添加到 ListView。新项目应填充第二个活动的 EditTexts 中的文本。

这是我的主要活动:

package news;

import android.content.Intent;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //Get subject value from addpost Activity
        final String new_value = getIntent().getStringExtra("newSubject");

        String [] new_subject = new String []
                {new_value};

        FloatingActionButton add_post_button = findViewById(R.id.post_btn);
        final ListView post_view = findViewById(R.id.news_feed);
        //Create Adapter to add the new subject to listview
        if (new_subject != null) {
            ArrayAdapter newslist_adapter = new ArrayAdapter(
                    MainActivity.this,
                    android.R.layout.simple_expandable_list_item_1, new_subject);
            post_view.setAdapter(newslist_adapter);
        }
        add_post_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, addpost_activity.class);
                MainActivity.this.startActivity(intent);
            }
        });
    }
}

这是第二个活动(addpost_activity):

package news;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.content.Intent;
import android.widget.EditText;
import android.widget.ListView;

import java.util.ArrayList;


public class addpost_activity extends AppCompatActivity {

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

        Button post_button = findViewById(R.id.post_btn);
        final EditText subject_text = findViewById(R.id.subject_edit);

        post_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(subject_text.getText() != null) {
                    Intent intent = new Intent(getApplicationContext(), MainActivity.class);
                    intent.putExtra("newSubject", subject_text.getText().toString());
                    startActivity(intent);
                }
            }
        });
    }
}

我现在的问题是应用程序每次启动时都会崩溃。我也从我的日志中收到这条消息:

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“java.lang.String java.lang.Object.toString()”


已解决: 感谢 Munir,问题解决了。

这是我的活动

主活动:

package news;

import android.app.Activity;
import android.content.Intent;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    ArrayAdapter newslist_adapter;
    ArrayList<String> new_subject = new ArrayList<>();

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

        FloatingActionButton add_post_button = findViewById(R.id.post_btn);

        //Create Adapter to add the new subject to listview
        add_post_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, addpost_activity.class);
                startActivityForResult(intent, 1);

            }
        });

    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        final ListView post_view = findViewById(R.id.news_feed);
        if (requestCode == 1) {
            if(resultCode == Activity.RESULT_OK){
                String new_value = data.getStringExtra("newSubject");
                new_subject.add(new_value);
                newslist_adapter = new ArrayAdapter(
                        MainActivity.this,
                        android.R.layout.simple_expandable_list_item_1, new_subject);
                post_view.setAdapter(newslist_adapter);

            }
        }
    }
} 

这是我的第二个活动(addpost_activity):

package news;

import android.app.Activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.content.Intent;
import android.widget.EditText;
import android.widget.ListView;

import java.util.ArrayList;


public class addpost_activity extends AppCompatActivity {

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

        Button post_button = findViewById(R.id.post_btn);
        final EditText subject_text = findViewById(R.id.subject_edit);

        post_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(subject_text.getText() != null) {
                    Intent intent = new Intent(getApplicationContext(), MainActivity.class);
                    intent.putExtra("newSubject", subject_text.getText().toString());
                    setResult(Activity.RESULT_OK, intent);
                    finish();
                }
            }
        });
    }
}

【问题讨论】:

  • 您的第一个活动是 MainActivity 还是 addpost?
  • addpost 是第二个活动
  • 您实际上不需要 MainActivity 中的 getIntent().getExtra,而是应该在 AddPostActivity 中使用 onActivityResult 和 setResult。
  • 您需要开始活动以获得结果。检查这个link
  • @Blinxen 你想在列表中保留旧条目吗?

标签: java android listview android-studio


【解决方案1】:

在 MainActivity.java 中,您应该重写一个名为“onActivityRecsult”的函数,当您从第二个活动返回到第一个活动时,将调用此方法。

【讨论】:

    【解决方案2】:

    如果您想在列表中保留旧条目,请使用 ArrayList insted of String [] 更改您的代码,如下所示。

    主要活动

    将此变量声明为全局变量

    ArrayAdapter newslist_adapter;
    ArrayList<String> new_subject = new ArrayList<>();
    

    设置适配器喜欢

    newslist_adapter = new ArrayAdapter(
                        MainActivity.this,
                        android.R.layout.simple_expandable_list_item_1, new_subject);
                post_view.setAdapter(newslist_adapter);
    

    将 startActivity 更改为 startActivityForResult

     add_post_button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Intent intent = new Intent(MainActivity.this, addpost_activity.class);
                    startActivityForResult(intent,100);
                }
            });
    

    在 onActivity 中重写此方法

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    
        if (requestCode == 100) {
                String result=data.getStringExtra("newSubject");
    new_subject.add(result)
               //Add this value to your adapter and call newslist_adapter.notifyDataSetChanged();
    
        }
    }
    

    并且在你的 addpost_activity 中设置你想要返回的数据

    post_button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if(subject_text.getText() != null) {
                        Intent intent = new Intent(getApplicationContext(), MainActivity.class);
                        intent.putExtra("newSubject", subject_text.getText().toString());
                        setResult(100,intent );
                       finish();
    
                    }
                }
            });
    

    【讨论】:

      【解决方案3】:

      为此,我建议使用Fragments 而不是两个Activities。然后MainActivity 会保存您的所有数据。

      Fragments guide

      【讨论】:

      • 我需要两个活动,因为我的主要活动将是巨大的,我的 addpost_activity 也将如此。我认为如果我在这里使用两个活动会更好。但你以另一种方式帮助了我。知道我不必总是创建新活动真的很有帮助。非常感谢。
      【解决方案4】:

      从您的MainActivity 调用addpost_activity 使用startActivityForResult() 方法而不是startActivity();

      在你的addpost_activity 中设置你想要返回的数据到FirstActivity

      post_button.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View view) {
                      if(subject_text.getText() != null) {
                          Intent intent = new Intent(getApplicationContext(), MainActivity.class);
                          intent.putExtra("newSubject", subject_text.getText().toString());
                          setResult(Activity.RESULT_OK,intent );
                         finish();
      
                      }
                  }
              });
      

      并在MainActivity 中通过覆盖onActivityResult() 访问结果

      @Override
      protected void onActivityResult(int requestCode, int resultCode, Intent data) {
      
          if (requestCode == 1) {
              if(resultCode == Activity.RESULT_OK){
                  String result=data.getStringExtra("newSubject");
                 //Add this value to your adapter and call notifyDataSetChanged();
              }
      
          }
      }
      

      【讨论】:

      • returnIntent 是做什么的?因为android studio说不能解决。
      • 改变意图
      猜你喜欢
      • 2016-01-31
      • 1970-01-01
      • 1970-01-01
      • 2013-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多