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

时间:2013-12-18 20:13:41

标签: android activity-lifecycle savestate

我有一个包含3项活动的应用homecalculationResulthelp。我要做的是在calculationResult时保存计算的详细信息用户导航到help。因此,当用户在help并按下操作栏后退图标时,计算结果仍会显示在calculationResult中。

到目前为止,我已按照本指南尝试实现此目的:Recreating an activity,但是当我实现它时,使用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);
    }

3 个答案:

答案 0 :(得分:0)

活动被操作系统杀死时,会调用onRestoreInstanceState()。 “这种情况发生在: •设备方向发生变化(您的活动被破坏并重新创建)  •在您面前有另一项活动,并且在某些时候操作系统会杀死您的活动以释放内存

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

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

答案 1 :(得分:0)

方法我跟着

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

如果您仍然遇到问题,请尝试告诉我们。

第1步

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

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

第2步

在“setContentView(R.layout.result);”之后添加这段代码。你的oncreate方法中的一行。 我已将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();
            } 

        });

答案 2 :(得分:0)

而不是这个

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

你应该写

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

通过再次声明,您没有将值分配给班级markOne

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

 android:launchMode="singleTop"

这将使用堆栈顶部已存在的活动的相同实例,因此将具有与之前相同的状态。

当您转到Help活动时,请尝试在CalculationResult活动中调用完成。

代表:

StartActivity(<Intent>);
finish();