2012-04-21 40 views
3

我幾乎閱讀了關於stack overflow中onSaveInstanceState和onRestoreInstanceState的所有文章,但無法解決我的問題。
我在我的main.java中有一個文本視圖和按鈕,當你點擊一個按鈕的值(一個是一個int變量)變量將增加並顯示在文本視圖中,但是當我旋轉我的手機方向更改),文本視圖重置。如何使用onSaveInstanceState和onRestoreInstanceState保存狀態,同時方向更改

我重寫onSaveInstanceState和onRestoreInstanceState,但它不起作用。 還有一件事,我爲景觀視圖有特殊的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

嚴重?這可能是我見過的最糟糕的格式化代碼... – 2012-04-21 14:35:03

+0

@AlexLockwood我知道我要編輯並整理好,但後來我就像W ... T ... H – Blundell 2012-04-21 14:41:10

+0

@Alexlockwood:D。你是對的,因爲我是機器人中的新人。 – 2012-04-21 14:58:51

回答

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

你真的想要使用這些方法嗎?

在這裏你去了一種解決問題的方法,只是把這個清單文件中

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

如果你這樣做,你的活動將不會重新加載各方面的意見,當你改變正在重置它們的值方向

+0

但它也會在其他情況下重新加載它.. – dvrm 2013-06-25 09:52:58

+3

這不是一個解決方案,它是一種解決方法重新啓動。你的活動可以在很多活動中重新開始,改變方向只是其中的一個。 – srgtuszy 2013-09-28 23:25:12

+0

廣泛而公開地建議避免這種做法,因爲它已經停止,甚至是一個解決方案,因爲android已經發展。 – Omaraf 2015-07-23 03:31:20

0

被忽視但嚴重的錯誤。 您必須先將數據傳遞給onSavedInstanceState()並調用onSavedInstanceState()。如果你認爲那麼你會發現它在傳遞要保存的數據之前無用地調用SavedInstanceState。它不會保存活動實例作爲onSavedInstanceState()之前被調用.. 應該爲:

@Override 
    protected void onSaveInstanceState(Bundle SavedInstanceState) 
    {   
    SavedInstanceState.putInt("salavat-count", a); 
    super.onSaveInstanceState(SavedInstanceState); 
    } 
相關問題