21

aacplayerアプリを持っていて、向きが縦向きから横向きに変わったときのアクティビティの状態を保存したいと思います。TextViewsは空ではないようです。これを使用して、textViewsをフリーズしようとしました。

android:freezesText="true"

私のマニフェスト:

android:configChanges="orientation"

私もこれを試しました:

@Override
    public void onConfigurationChanged(Configuration newConfig){
        super.onConfigurationChanged(newConfig);
        setContentView(R.layout.main2);

したがって、向きが横向きに変わると、layout-land main2.xmlが表示されますが、これは機能しますが、テキストビューが消えて空になります。音楽のストリーミングはうまく機能します。向きが変わると聞くことができますが、デバイスの向きを変えるたびにテキストビュー内のテキストが消えてしまいます。

状態を保存できるようにこれを修正するにはどうすればよいですか?

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
....
....

どうもありがとうございます。

4

4 に答える 4

59

向きが変わっても、横向きのレイアウトファイルに手動で変更する必要はありません。Androidはこれを自動的に行います。向きが変わると、Androidは現在のアクティビティを破棄し、新しいアクティビティを再度作成します。これが、テキストが失われる理由です。

縦向きと横向きに別々のレイアウトが必要な場合は、2つの部分を実行する必要があります。

  1. 縦向きと横向きの2つのXMLレイアウトファイルがあると仮定して、main.xmlレイアウトファイルを次のフォルダーに配置します。

    res / layout /main.xml<-これは縦向きのレイアウトになります
    res/layout-land /main.xml<-これは横向きのレイアウトになります

    android:configChanges="orientation"必要なのはこれだけです。マニフェストファイルに触れて、を変更またはオーバーライドする必要はありませんonConfigurationChanged()。実際、達成しようとしていることについては、これに触れないことをお勧めします。

  2. ここで、テキストビューからテキストを保存します=)レイアウトxmlファイルでテキストビューの名前がMyTextViewであると仮定します。あなたの活動には以下が必要です:

    private TextView mTextView;
    private static final String KEY_TEXT_VALUE = "textValue";
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       mTextView = (TextView) findViewById(R.id.main);
       if (savedInstanceState != null) {
          CharSequence savedText = savedInstanceState.getCharSequence(KEY_TEXT_VALUE);
          mTextView.setText(savedText);
       }
    }
    
    @Override
    protected void onSaveInstanceState (Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putCharSequence(KEY_TEXT_VALUE, mTextView.getText());
    }
    

基本的に、Androidは向きを変更するためにアクティビティを破棄して再作成するたびに、破棄するonSaveInstanceState()前に呼び出し、再作成onCreate()後に呼び出します。onSaveInstanceStateでバンドルに保存するものは何でも、onCreate()パラメーターから戻ることができます。

したがって、テキストビューの値をに保存し、onSaveInstanceState()それを読み取ってonCreate()にテキストビューを入力します。アクティビティが初めて作成される場合(回転の変更によるものではない)、savedInstanceStateはでnullになりますonCreate()。また、おそらく必要ありませんandroid:freezesText="true"

アクティビティが破棄されて再作成されると、保存したすべての変数が失われるため、必要に応じて他の変数を保存してみることもできます。

于 2012-10-23T03:24:17.500 に答える
2

これを行うには2つの方法があります。最初の方法はAndroidManifest.xmlファイルにあります。これをアクティビティのタグに追加できます

android:configChanges="keyboardHidden|orientation|screenSize|screenLayout"

または、これを処理する2つのメソッドをオーバーライドできます。この方法にはもう少し手間がかかりますが、間違いなくはるかに優れています。onSaveInstanceState強制終了される前のアクティビティの状態を保存し、onRestoreInstanceState後でその情報を復元します。詳細についてonStart() は、公式ドキュメントを参照してください。

以下のサンプルコードではint、スピナーからの現在の選択とラジオボタンの2つの値を保存しています。

 @Override
    public void onSaveInstanceState(@NonNull Bundle savedInstanceState) {
        spinPosition = options.getSelectedItemPosition();
        savedInstanceState.putInt(Constants.KEY, spinPosition);
        savedInstanceState.putInt(Constants.KEY_RADIO, radioPosition);
        super.onSaveInstanceState(savedInstanceState);

    }

    // And I am restoring those values with `getInt`, then I can pass those stored values into the spinner and radio button group to select the same values that we saved earlier. 

    @Override
    public void onRestoreInstanceState(@NotNull Bundle savedInstanceState) {
        spinPosition = savedInstanceState.getInt(Constants.KEY);
        radioPosition = savedInstanceState.getInt(Constants.KEY_RADIO);
        options.setSelection(spinPosition, true);
        type.check(radioPosition);
        super.onRestoreInstanceState(savedInstanceState);
    }
于 2020-04-27T13:17:49.367 に答える
1
static CharSequence savedText;

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

    if(savedText != null) {
        TextView mTextView = (TextView) findViewById(R.id.main);
        mTextView.setText(savedText);
    }
}

// Another function in activity, when you change text
public void actionButton(View view) {
    // Change and save text in textView
    savedText = "Change text";
    mTextView.setText(savedText);
}

私のためのその仕事。しかし、Androidのコードスタイルとアーキテクチャは良くないと思います。

于 2017-10-16T11:24:35.377 に答える
0

KOTLIN static var / valで使用します:

class MyFragment : Fragment()
{
     //all my code
     //access to static vars -> MyStaticClass.hello
}

class MyStaticClass 
{
    companion object {
        var hello: String = "Static text"
        var number_static: Int = 0
    }
}
于 2019-04-09T21:52:52.343 に答える