Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 导航后如何保存活动状态?_Android_Activity Lifecycle_Savestate - Fatal编程技术网

Android 导航后如何保存活动状态?

Android 导航后如何保存活动状态?,android,activity-lifecycle,savestate,Android,Activity Lifecycle,Savestate,我有一个包含3个活动的应用程序,home、calculationResult和help。当用户导航到help时,我试图在calculationResult上保存计算的详细信息。因此,当用户在help中并按下操作栏返回图标时,计算结果仍将存在于calculationResult中 到目前为止,我一直试图通过以下指南来实现这一点:,但是当我实现它时,我想要存储的变量在与savedInstanceState一起使用时无法识别。下面是我在结果类中如何尝试这样做的。有人能指出我在这方面出了什么问题,或者这

我有一个包含3个活动的应用程序,
home
calculationResult
help
。当用户导航到
help
时,我试图在
calculationResult
上保存计算的详细信息。因此,当用户在
help
中并按下操作栏返回图标时,计算结果仍将存在于
calculationResult

到目前为止,我一直试图通过以下指南来实现这一点:,但是当我实现它时,我想要存储的变量在与
savedInstanceState
一起使用时无法识别。下面是我在结果类中如何尝试这样做的。有人能指出我在这方面出了什么问题,或者这是完成保存活动状态的正确方法吗

public class CalcResult extends Activity implements OnClickListener{

TextView result1;

static final String MARK1 = "marking1";

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.result);

        if (savedInstanceState != null) { 
            // Restore value of members from saved state 
            //not recognizing this variable mark1 which I'm setting to the variable that stores the result of the calculation.
            mark1 = savedInstanceState.getDouble(MARK1); 
        }

        final Intent intent1=new Intent(this,AboutActivity.class);
        final Intent intent2=new Intent(this,MainActivity.class);
        final Intent intent3=new Intent(this,MainActivity.class);

        final ViewGroup actionBarLayout = (ViewGroup) getLayoutInflater().inflate(
                R.layout.a,
                null);

        // Set up your ActionBar
        final ActionBar actionBar = getActionBar();
        actionBar.setDisplayShowHomeEnabled(false);
        actionBar.setDisplayShowTitleEnabled(false);
        actionBar.setDisplayShowCustomEnabled(true);
        actionBar.setCustomView(actionBarLayout);

        final Button actionBarHome = (Button) findViewById(R.id.action_bar_title);
        actionBarHome.setBackgroundResource(R.drawable.ic_action_back);
        actionBarHome.setOnClickListener(this);
        actionBarHome.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {                

               startActivity(intent2);

            }

        });

        final Button actionBarInfo = (Button) findViewById(R.id.action_bar_staff);
        actionBarInfo.setBackgroundResource(R.drawable.ic_action_help);
        actionBarInfo.setOnClickListener(this);
        actionBarInfo.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {                

               startActivity(intent1);

            }

        });


        final Button actionBarHoome = (Button) findViewById(R.id.action_bar_home);
        actionBarHoome.setBackgroundResource(R.drawable.appicon);
        actionBarHoome.setOnClickListener(this);
        actionBarHoome.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {                

               startActivity(intent3);

            }

        });
        result1 = (TextView)findViewById(R.id.markOne);


        Intent intent = getIntent();

        double markOne = intent.getDoubleExtra("number1", 0);

        DecimalFormat df = new DecimalFormat("#.##");

        result1.setText(String.valueOf(df.format(markOne)+"mm"));

    }


    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        // Save the user's current game state
        //Also doesn't recognise markOne here ->
        savedInstanceState.putDouble(MARK1, this.markOne);


        // Always call the superclass so it can save the view hierarchy state
        super.onSaveInstanceState(savedInstanceState);
    }
当操作系统杀死活动时,调用onRestoreInstanceState()。“这种情况发生在: •设备方向发生变化(您的活动被销毁并重新创建) •您前面还有另一个活动,在某个时候,操作系统会停止您的活动以释放内存

下次启动活动时,将调用onRestoreInstanceState()


但在您的情况下,这可能不会发生。

我采用的方法

如果我是第一次启动此活动,我将设置一个全局变量作为标志。如果全局变量与我设置的变量相同,我将保持editText不变。(在您的情况下,结果1)。如果该值已更改,我将为此值设置editText。如果用户只单击一次editText,我将跟踪更改并存储值。当您认为不再需要mark1时,可以将flag的值再次设置为“FIRSTENTRY”。这会奏效的

如果您仍然面临问题,请尝试告诉我们

步骤1

创建了一个类来存储静态全局变量

public class Constants {        
public static String sFlag= "FIRSTENTRY";
}
步骤2

在oncreate方法的“setContentView(R.layout.result);”行之后添加这段代码我将result1声明为EditText,而不是TextView。

if(!Constants.sFlag.equalsIgnoreCase("FIRSTENTRY"))
        {
            result1.setText(Constants.sFlag);
        }

        result1.addTextChangedListener(new TextWatcher() {

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                // TODO Auto-generated method stub
                Constants.sFlag = result1.getText().toString();
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

                Constants.sFlag = result1.getText().toString();

            }

            @Override
            public void afterTextChanged(Editable s) {
                // TODO Auto-generated method stub
                Constants.sFlag = result1.getText().toString();
            } 

        });
而不是这个

double markOne = intent.getDoubleExtra("number1", 0);
你应该写

markOne = intent.getDoubleExtra("number1", 0);
通过再次声明,您没有将值分配给类级别
markOne

您还可以尝试将calculateResult活动的lauchmode设置为singleTop

 android:launchMode="singleTop"
这将使用已存在于堆栈顶部的活动的相同实例,因此将具有与以前相同的状态


当移动到
计算结果
活动时,尝试在
帮助
活动中调用finish

例如:

StartActivity(<Intent>);
finish();
StartActivity();
完成();

markOne不是类的成员,而是函数“onCreate”的成员,因此它在任何其他函数中都不可见。你也必须重写“onRestoreInstanceState”你能给我看一个我的类的代码示例吗?这样比理论更容易理解。Thank演示一种更简单的方法,将值存储在共享首选项中并显示数据。默认情况下,您可以将一个值存储为“NOVALUE ENTERED”,如果该值被修改,您可以根据该值更新TextView。感谢您的回复,我尝试将启动模式设置为
singleTop
,但没有解决此问题。您知道如何保存它吗,我正在考虑将该变量保存到内存中,你知道怎么做吗?当你转到
CalculationResult
activity时,试着在
Help
活动中调用finish。那么,android:launchMode:finish在帮助活动中?还是另一种语法?在帮助活动中,当您启动calculationResult活动时,只需调用finish()。