Android 移动到另一个活动时在活动中保存数据

Android 移动到另一个活动时在活动中保存数据,android,Android,我的问题是在转到其他活动时将数据保存在主活动中。在这里的实践程序中,我在我的主要活动中有两个按钮,当您单击第一个按钮时,您将进入第二个名为firstapp的活动,其中只有一个分级栏。我选择你的评级,然后按后退按钮,在按钮下的文本视图中,它获取评级栏的字符串值并告诉评级。但是,当我单击第二个按钮并移动到第三个名为secondapp的活动并进行评级,然后返回到主要活动时,我在第二个文本视图中看到了正确的信息,但我所做的第一个评级现在已从文本视图中消失 我不知道如何将这些信息保存在那里,我已经在那里乱

我的问题是在转到其他活动时将数据保存在主活动中。在这里的实践程序中,我在我的主要活动中有两个按钮,当您单击第一个按钮时,您将进入第二个名为firstapp的活动,其中只有一个分级栏。我选择你的评级,然后按后退按钮,在按钮下的文本视图中,它获取评级栏的字符串值并告诉评级。但是,当我单击第二个按钮并移动到第三个名为secondapp的活动并进行评级,然后返回到主要活动时,我在第二个文本视图中看到了正确的信息,但我所做的第一个评级现在已从文本视图中消失

我不知道如何将这些信息保存在那里,我已经在那里乱搞了一段时间了

package com.example.brent.appmanagement;

import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

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

        ratingapp1();
        ratingapp2();
        getrating();


    }



    private void getrating(){
        //firstrating = findViewById(R.id.savedrating1);
       // secondrating = findViewById(R.id.savedrating2);


        //Intent i = getIntent();
        //firstrating.setText(i.getExtras().getString("rating"));
       // secondrating.setText(i.getStringExtra("rating2"));

        Bundle extras = getIntent().getExtras();
        if (extras != null) {
            String rating = extras.getString("rating");
            firstrating = findViewById(R.id.savedrating1);
            firstrating.setText(rating);
            String rating2 = extras.getString("rating2");
            secondrating = findViewById(R.id.savedrating2);
            secondrating.setText(rating2);
        }

    }
    private void ratingapp1(){
        Button rateapp1 = findViewById(R.id.rateapp1);
        rateapp1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT){
                    Toast.makeText(getApplicationContext(),
                            "Sorry you need to upgrade your phone before you 
can rate the apps", Toast.LENGTH_LONG).show();
                }else {
                    Intent intent = new Intent(getApplicationContext(), 
firstapp.class);
                    startActivity(intent);
                }
            }
        });
    }
    private void ratingapp2(){
        Button rateapp2 = findViewById(R.id.rateapp2);
        rateapp2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT){
                    Toast.makeText(getApplicationContext(),
                            "Sorry you need to upgrade your phone before you 
can rate the apps", Toast.LENGTH_LONG).show();
                }else {
//                    Bundle extras = getIntent().getExtras();
//                    if(extras != null) {
//                        firstrating =  findViewById(R.id.savedrating1);
//                        firstrating.setText(extras.getString("rating"));
//                    }
                    Intent intent2 = new Intent(getApplicationContext(), 
secondapp.class);
                    startActivity(intent2);
                }
            }
        });
    }
}
secondapp活动

package com.example.brent.appmanagement;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.RatingBar;
import android.widget.Toast;

public class secondapp extends AppCompatActivity {

    public RatingBar ratingBar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_secondapp);
        return2();
        ratingBar =  findViewById(R.id.ratingBar);
    }
    public void rateMe(View view){

        Toast.makeText(getApplicationContext(),
                String.valueOf(ratingBar.getRating()), 
Toast.LENGTH_LONG).show();
    }
    public void return2(){
        Button returntomain2 = findViewById(R.id.returntomain2);
        returntomain2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent i = new Intent(getApplicationContext(), 
MainActivity.class);
                i.putExtra("rating2", "you have rated this app " + 
String.valueOf(ratingBar.getRating() + " stars out of 5"));
                startActivity(i);
            }
        });
    }
}
不要介意注释掉的代码,如果您需要我的xml,只需说我不想发布太多要查看的内容,提交按钮和toast消息只是为了让我看到它的值是正确的。如果有什么我不应该做的事情,请告诉我,就像我说的,我是android新手,这只是练习

谢谢大家


好的,我尝试了startActivityForResult,设置了结果并覆盖了onActivityresult方法,即使在调用finish()之后,我仍然有相同的结果当返回到主活动时,不是startActivity…同样的事情发生了,我进入firstapp rate,它返回到main,我的数据已传输到main,现在在测试框中…但随后我进入second app rate,它返回,来自第一个应用的数据,在文本框中,现在不见了

您的问题是,您正在启动一个新的应用程序当您返回MainActivity实例时,就会丢失以前的所有数据。您要做的是调用startActivityForResult,并在方法return1和return2()中调用firstapp和secondapp的内部。您应该调用setResult(),传入RESULT_OK常量和包含希望MainActivity了解的数据的意图。然后立即调用finish。在MainActivity内部,您希望重写ActivityResult()方法,该方法将接收传递给setResult()的数据


下面是一个开发人员站点的示例,用于解释此API。

首先,我建议您不要创建MainActivity的新实例,只需返回堆栈中当前活动(第一个应用程序或第二个应用程序)下的MainActivity

关于处理评级回报:

  • 在第一个/第二个应用程序活动中,您应该使用
    SharedReferences
    在第一个/第二个应用程序活动中保存评级。这里有一个例子来解释
    共享引用
  • 使用
    startActivityForResult()
    启动第一个/第二个应用程序活动,以便在主活动中的
    onActivityResult()
    上获得回电
  • 每次用户从第一个/第二个应用程序活动返回MainActivity时,都会调用onActivityResult(),在这里您可以从
    SharePreferences
    获得数据评级,并更新您的TextView
  • 更新 试试这个

    在你的主要活动中

    @Override
    protected void onResume() {
        super.onResume();
        updateRating();
    }
    
    private void updateRating(){
        SharedPreferences sharedPref = getPreferences(Context.MODE_PRIVATE);
        float rating1 = sharedPref.getFloat("rating1",-1);
        float rating2 = sharedPref.getFloat("rating2",-1);
        // -1 is default value
    
        if(rating1 != -1) {
            firstrating.setText(String.valueOf(rating1));
        }
    
        if(rating2 != -1) {
            secondrating.setText(String.valueOf(rating2));
        }
    }
    

    希望能有帮助

    ps我知道我应该使用一个片段,这样我就不会有这个问题了我只是想弄明白问题是当你给它评分时,你没有“回到”主要活动。。。你只是打开了它的第二个副本。查看主活动中的
    startActivityForResult()
    ,然后查看
    setResult()
    +
    finish()
    在子活动中。感谢您提供的信息。我要查找startActivityForResult和setResult的代码示例或其他内容,然后逐步查看,以便了解实际情况on@Brent我用一个链接更新我的答案以帮助你。我指的是逐步设置断点,您应该知道onActivityResult是异步调用的,还有所有的生命周期方法,所以逐步使用调试器是没有帮助的。很酷,谢谢你的提示,我必须研究共享的首选项,必须设置为所有人都尝试了它,并得到了相同的结果…不知道我是否不理解某些内容,或者我是否解释得不好,不被理解,或者什么,但我无法理解这…我想我的另一个选择是查看共享首选项或其他内容我已经更新了答案,尝试一下,让我知道问题是否解决了谢谢我尝试了这种方式我唯一的问题不是主函数中的if语句,这里有firstrating.setText(rating1)它说无法解决方法setText(float)但我相信我能明白这是我的错。只需更改为firstrating.setText(String.valueOf(rating1));。我已经更新了答案。让我知道我的答案是否能解决你的问题。谢谢
    private void return1(){
        Button returntomain1 = findViewById(R.id.returntomain1);
        returntomain1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                SharedPreferences sharedPref = getPreferences(Context.MODE_PRIVATE);
                SharedPreferences.Editor editor = sharedPref.edit();
                editor.putFloat("rating1", ratingBar.getRating());
                editor.commit();
                finish();
            }
        });
    }
    
    public void return2(){
        Button returntomain2 = findViewById(R.id.returntomain2);
        returntomain2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                SharedPreferences sharedPref = getPreferences(Context.MODE_PRIVATE);
                SharedPreferences.Editor editor = sharedPref.edit();
                editor.putFloat("rating2", ratingBar.getRating());
                editor.commit();
                finish();
            }
        });
    }
    
    @Override
    protected void onResume() {
        super.onResume();
        updateRating();
    }
    
    private void updateRating(){
        SharedPreferences sharedPref = getPreferences(Context.MODE_PRIVATE);
        float rating1 = sharedPref.getFloat("rating1",-1);
        float rating2 = sharedPref.getFloat("rating2",-1);
        // -1 is default value
    
        if(rating1 != -1) {
            firstrating.setText(String.valueOf(rating1));
        }
    
        if(rating2 != -1) {
            secondrating.setText(String.valueOf(rating2));
        }
    }