android 如何使用onSavedInstanceState示例

xnifntxz  于 2022-12-25  发布在  Android
关注(0)|答案(7)|浏览(436)

当谈到保存状态时,我很困惑。所以我知道当Activity即将被销毁时会调用onSaveInstanceState(Bundle)。但是如何在其中存储信息并将其恢复到onCreate(Bundle savedInstanceState)中的原始状态?我不明白这个包将如何恢复信息。如果有人能提供一个示例,将会很有帮助。开发人员指南没有“I don“我解释不好这件事。

public class Conversation extends Activity {
    private ProgressDialog progDialog;
    int typeBar;
    TextView text1;
    EditText edit;
    Button respond;
    private String name;
    private String textAtView;
    private String savedName;

    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);

        setContentView(R.layout.dorothydialog);
        text1 = (TextView)findViewById(R.id.dialog);
        edit = (EditText)findViewById(R.id.repsond);
        respond = (Button)findViewById(R.id.button01);

        if(savedInstanceState != null){
            savedInstanceState.get(savedName);
            text1.setText(savedName);
        }
        else{
            text1.setText("Hello! What is your name?");
            respond.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    name = edit.getText().toString();
                    text1.setText("Nice to meet you "+ name);
                }   
            });
        }
    }

    @Override
    public void onSaveInstanceState(Bundle outState){
        super.onSaveInstanceState(outState);
        outState.putString(savedName, name);
    }
}
6rqinv9w

6rqinv9w1#

Bundle是一个容器,用于存储所有需要保存的信息,可以使用put* 函数向其中插入数据,下面是一个可以用来在Bundle中存储数据的put函数的简短列表(还有更多)。

putString
putBoolean
putByte
putChar
putFloat
putLong
putShort
putParcelable (used for objects but they must implement Parcelable)

在你的onCreate函数中,这个Bundle被传递回程序。检查应用程序是否被重新加载或第一次启动的最好方法是:

if (savedInstanceState != null) {
    // Then the application is being reloaded
}

要取回数据,可以使用get* 函数,就像put* 函数一样,数据以名称-值对的形式存储,这类似于散列表,你提供一个键和值,然后当你想要取回值时,你给予键,函数就得到值,下面是一个简短的例子。

@Override
public void onSaveInstanceState(Bundle outState) {
   outState.putString("message", "This is my message to be reloaded");
   super.onSaveInstanceState(outState);
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (savedInstanceState != null) {
        String message = savedInstanceState.getString("message");
        Toast.makeText(this, message, Toast.LENGTH_LONG).show();
    }
}

您保存的消息将被烤到屏幕上。

rslzwgfq

rslzwgfq2#

所有新的Android开发者都应该知道的一个主要注意事项是,只要你给Widget(TextView、Buttons等)分配了一个ID,它们中的任何信息都会被Android自动持久化。这意味着大部分UI状态都不会有问题。只有当你需要存储其他数据时,这才会成为一个问题。
Android Docs开始:
您需要做的唯一工作是为每个要保存其状态的小部件提供一个唯一的ID(带有android:id属性)。

yk9xbfzb

yk9xbfzb3#

一个很好的信息:不需要在onCreate()方法中检查Bundle对象是否为空,使用onRestoreInstanceState()方法,系统在onStart()方法之后调用该方法,只有当有保存状态需要恢复时,系统才会调用onRestoreInstanceState(),因此不需要检查Bundle是否为空

9cbw7uwe

9cbw7uwe4#

店铺信息:

static final String PLAYER_SCORE = "playerScore";
static final String PLAYER_LEVEL = "playerLevel";

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save the user's current game state
    savedInstanceState.putInt(PLAYER_SCORE, mCurrentScore);
    savedInstanceState.putInt(PLAYER_LEVEL, mCurrentLevel);

// Always call the superclass so it can save the view hierarchy state
super.onSaveInstanceState(savedInstanceState);
}

如果您不想恢复onCreate-Method中的信息:
以下是一些例子:Recreating an Activity
您可以选择实现onRestoreInstanceState(),而不是在onCreate()过程中恢复状态,系统将在onStart()方法之后调用该方法。仅当存在要恢复的已保存状态时,系统才会调用onRestoreInstanceState(),因此您无需检查Bundle是否为空

public void onRestoreInstanceState(Bundle savedInstanceState) {
// Always call the superclass so it can restore the view hierarchy
super.onRestoreInstanceState(savedInstanceState);

// Restore state members from saved instance
mCurrentScore = savedInstanceState.getInt(PLAYER_SCORE);
mCurrentLevel = savedInstanceState.getInt(PLAYER_LEVEL);
}
aurhwmvo

aurhwmvo5#

基本上,onSaveInstanceState(Bundle outBundle)会给予你一个bundle。当你查看Bundle类时,你会发现你可以在里面放很多不同的东西。在下一次调用onCreate()时,你只需要把Bundle作为一个参数取回。然后你可以再次读取你的值并恢复你的活动。
假设您有一个带有EditText的Activity,用户在其中写入了一些文本,之后系统调用onSaveInstanceState(),您从EditText读取文本并通过Bundle.putString(“edit_text_value”,theValue)将其写入Bundle。
现在调用onCreate,检查提供的bundle是否不为空,如果是,可以通过Bundle.getString(“edit_text_value”)恢复值,并将其放回EditText。

q0qdq0h2

q0qdq0h26#

这是额外的信息。
想象一下这个场景
1.活动A启动活动B。
1.活动B通过以下方式启动新的活动APrime

Intent intent = new Intent(getApplicationContext(), ActivityA.class);
startActivity(intent);

1.活动APrime与活动A没有关系。
在这种情况下,ActivityAPrime.onCreate()中的捆绑包将为空。
如果ActivityA和ActivityAPrime应该是相同的活动而不是不同的活动,则ActivityB应该调用finish(),而不是使用startActivity()。

dbf7pr2w

dbf7pr2w7#

如果未从savedInstanceState加载数据,请使用以下代码。
问题是url调用未完全完成,因此,请检查是否加载了数据,然后显示instanceState值。

//suppose data is not Loaded to savedInstanceState at 1st swipe
if (savedInstanceState == null && !mAlreadyLoaded){
    mAlreadyLoaded = true;
    GetStoryData();//Url Call
} else {
    if (listArray != null) {  //Data Array From JsonArray(ListArray)
        System.out.println("LocalData  " + listArray);
        view.findViewById(R.id.progressBar).setVisibility(View.GONE);
    }else{
        GetStoryData();//Url Call
    }
}

相关问题