2012-04-21 8 views
3

onSaveInstanceStateとonRestoreInstanceStateについてのほとんどの記事をStack Overflowで読みましたが、私は問題を解決できません。
私のmain.javaにテキストビューとボタンがあり、ボタンの値を(はint変数です)変数が増加してテキストビューに表示されますが、方向の変更)、テキストビューのリセット。オリエンテーションの変更中にonSaveInstanceStateとonRestoreInstanceStateで状態を保存する方法

私はonSaveInstanceStateとonRestoreInstanceStateを上書きしますが、動作しません。 もう1つ、私はランドスケープビュー用の特別なlayout-land.xmlファイルを持っています。ここ

は私のコードは、私が本当に必要

import android.app.Activity; 
import android.graphics.Typeface; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 

public class main extends Activity { 
    /** Called when the activity is first created. */ 
    public int a = 0;  
    public String fonts="TAHOMA.TTF"; 

    TextView tv = (TextView) findViewById(R.id.salavat);  
    Button b = (Button) findViewById(R.id.showsalavat); 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     b.setOnClickListener(new Button.OnClickListener() { 
      public void onClick(View arg0) { 
       a++; 
       tv.setText(""+a); 
      } 
     }); 
    } 
    @Override   
    protected void onSaveInstanceState(Bundle SavedInstanceState) { 
     super.onSaveInstanceState(SavedInstanceState);    
     SavedInstanceState.putInt("salavat-count", a); 
    } 
    @Override  
    protected void onRestoreInstanceState(Bundle savedInstanceState) { 
     super.onRestoreInstanceState(savedInstanceState);  
     a= savedInstanceState.getInt ("salavat-count"); 
    } 
} 

、ここで私のmain.xml

<TextView 
     android:id="@+id/shoma" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:gravity="right" 
     android:text="@string/shoma" 
     android:textSize="20sp" /> 

    <Button 
     android:id="@+id/showsalavat" 
     android:layout_width="fill_parent" 
     android:layout_height="150dp" 
     android:text="+" 
     android:textSize="100sp" /> 

    <TextView 
     android:id="@+id/eltemas" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginBottom="55dp" 
     android:text="@string/eltemas" /> 

    <TextView 
     android:id="@+id/salavat" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Large Text" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:textSize="35sp" /> 

    <TextView 
     android:id="@+id/ferestade" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginBottom="24dp" 
     android:text="@string/salavat" 
     android:textSize="20sp" /> 

</LinearLayout> 

ですこれについていくつか助けてください。 本当にありがとうございます。アップデートとして

+3

真剣に?これはおそらく私が今まで見た中で最悪のフォーマットされたコードです... –

+0

@AlexLockwood私は '編集'と整頓しようとしていたが、その後私はW ... T ... H – Blundell

+0

@Alexlockwood:Dのようだった。私はアンドロイドの新鮮な人間ですから、そうです。 –

答えて

5

私はこのコードがあなたに役立つと思います。

public class MainActivity extends Activity 
{ 

    protected void onSaveInstanceState(Bundle outState) 
    { 
     super.onSaveInstanceState(outState); 
     System.out.println("TAG, onSavedInstanceState"); 

     final TextView text = (TextView)findViewById(R.id.textView1); 
     CharSequence userText = text.getText(); 
     outState.putCharSequence("savedText", userText); 
    } 
    protected void onRestoreInstanceState(Bundle savedState) 
    {  
     System.out.println("TAG, onRestoreInstanceState"); 
     final TextView text = (TextView)findViewById(R.id.textView1); 
     CharSequence userText = savedState.getCharSequence("savedText"); 
     text.setText(userText); 
    } 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     final String name = "5"; 

     final TextView show = (TextView)findViewById(R.id.textView1); 
     Button btn = (Button)findViewById(R.id.button1); 
     btn.setOnClickListener(new View.OnClickListener() 
     { 

      public void onClick(View v) 
      { 
       // TODO Auto-generated method stub 

       show.setText(name); 

      } 
     }); 
    } 
} 
7

は、あなただけのfreezesText="true"

http://developer.android.com/reference/android/R.attr.html#freezesText

<TextView 
    android:id="@+id/eltemas" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:freezesText="true"/> 

それとも


を設定することができますこれは最も単純な例です:

TextView yourTextView; 

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

    yourTextView = (TextView) findViewById(R.id.your_textview); 

} 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     outState.putString("YourTextViewTextIdentifier", yourTextView.getText().toString()); 

     super.onSaveInstanceState(outState); 
    } 

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

     yourTextView.setText(savedInstanceState.getString("YourTextViewTextIdentifier")); 
    } 

しかし、あなたの状態を表す内部クラスを持つことは、オリエンテーションの変更に多くのオブジェクトを保存し始めたときにはずっとうれしいでしょう。

内部クラスを使用すると、以下のようになります。内部クラスを保存する状態がますます増えるにつれて、ハンドラにはずっと簡単になりました(想像できます)。

private static class State implements Serializable { 

    private static final String STATE = "com.your.package.classname.STATE"; 

    private String yourTextViewText; 

    public State(String yourTextViewText) { 
     this.yourTextViewText = yourTextViewText; 
    } 

    public String getYourTextViewText() { 
     return yourTextViewText; 
    } 
} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    State s = new State(yourTextView.getText().toString()); 

    outState.putSerializable(State.STATE, s); 

    super.onSaveInstanceState(outState); 
} 

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

    State s = (State) savedInstanceState.getSerializable(State.STATE); 

    yourTextView.setText(s.getYourTextViewText()); 
} 
0

保存された値でビューコンポーネントを再構築する必要があります。 あなたのtextviewに保存された値を入力してください。

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
    a = savedInstanceState.getInt ("salavat-count"); 
    tv.setText(""+a); 
} 
-1

本当にこれらの方法を使用しますか?

ここでは、あなたがこれを行う場合は、変更されたときに、あなたの活動は、その値をresetingすべてのビューを再ロードしませんちょうどあなたのマニフェストファイル内にこれを入れ

<activity android:name="package.subpackage.xptoactivity" android:configChanges="orientation"></activity> 

、あなたの問題への解決策のようなものを行きます向き

+0

しかし、他の状況でもそれをリロードします.. – dvrm

+3

これは解決策ではありません。再起動します。あなたの活動は、いくつかのイベントの間に再開することができます。 – srgtuszy

+0

アンドロイドが進化するにつれて回避策がなくなり、このプラクティスを避けることが広く一般に推奨されています。 – Omaraf

0

無視されているが深刻な間違い。 最初にデータをonSavedInstanceState()と呼び出しonSavedInstanceState()に渡す必要があります。あなたが考えると、保存するデータを渡す前にonSavedInstanceStateを呼び出すことは役に立たないでしょう。 onSavedInstanceState()が前に呼び出されたときにアクティビティインスタンスを保存することはありません。これは次のようにする必要があります。

@Override 
    protected void onSaveInstanceState(Bundle SavedInstanceState) 
    {   
    SavedInstanceState.putInt("salavat-count", a); 
    super.onSaveInstanceState(SavedInstanceState); 
    } 
関連する問題