亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

OnRetainCustomConfigurationInstance 之后所有 EditTexts

OnRetainCustomConfigurationInstance 之后所有 EditTexts

素胚勾勒不出你 2021-11-11 18:04:35
當我使用 onRetainCustomNonConfigurationInstance 保存包含在我的自定義 EditTexts 中的文本時,在我旋轉設備后,最后一個 EditText 中包含的文本被復制到目標布局中的所有其他文本。在用斷點調試時,我發現所有的文本值一直都是正確的。但是在更改完成后,所有 EditText 都會顯示相同的文本(來自最后一個的文本),并且焦點將分配給布局中的第一個。我在最簡單的項目中復制了這種行為。我嘗試了 android API 級別 24 和 28。這種行為來自哪里,我該如何解決?主活動.java :public class MainActivity extends AppCompatActivity {    private ArrayList<CustomEdit> editList=new ArrayList<CustomEdit>();    private LinearLayout layout;    private Button addButton;    @RequiresApi(api = Build.VERSION_CODES.M)    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        addButton=findViewById(R.id.add_button);        layout = findViewById(R.id.layout);        addButton.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                addEdit();            }        });        CustomSave data = (CustomSave)getLastCustomNonConfigurationInstance();        if(data==null) return;        for(int i = 0; i<data.texts.size();i++){            addEdit(data.texts.get(i));        }    }    @Override    public Object onRetainCustomNonConfigurationInstance() {        CustomSave data = save();        return data;}    private CustomSave save(){        ArrayList<String> texts = new ArrayList<String>();        for(int i =0; i<editList.size(); i++)            texts.add(editList.get(i).getText());        return new CustomSave(texts);}    /**     * Create a new custom EditText with hint     */    private void addEdit(){        CustomEdit newEdit = new CustomEdit(this,editList.size());        layout.addView(newEdit,editList.size());        editList.add(newEdit);}}
查看完整描述

2 回答

?
aluckdog

TA貢獻1847條經驗 獲得超7個贊

對于如何解決此問題,您有兩種選擇:將代碼移動到活動生命周期中的不同點或更改 .xml 的 xml 定義CustomEdit。


安卓生命周期

將此代碼移出onCreate():


CustomSave data = (CustomSave)getLastCustomNonConfigurationInstance();

if(data==null) return;


for(int i = 0; i<data.texts.size();i++){

    addEdit(data.texts.get(i));

}

并將其放入onRestoreInstanceState():


@Override

protected void onRestoreInstanceState(Bundle savedInstanceState) {

    super.onRestoreInstanceState(savedInstanceState);


    CustomSave data = (CustomSave)getLastCustomNonConfigurationInstance();

    if(data==null) return;


    for(int i = 0; i<data.texts.size();i++){

        addEdit(data.texts.get(i));

    }

}

或者


XML 定義

將此屬性添加到文件中的<EditText>標記custom_edit_text.xml:


android:saveEnabled="false"

您為保存/恢復文本值而編寫的代碼沒有任何問題。但是,在 之后 onCreate(),Android 會自動執行自己的保存/恢復邏輯,這會覆蓋您所做的。


如果您將代碼從 移動onCreate()到onRestoreInstanceState(),那么您的代碼將在 Android 自動保存/恢復后運行,因此您將“獲勝”。或者,您可以通過添加saveEnabled=false屬性來禁用自動保存/恢復。


Android 的自動保存/恢復不起作用的原因是它基于每個視圖的android:id屬性,并且您的EditText標簽都具有相同的 id。這意味著所有四個值都使用相同的鍵保存,因此最后一個值會覆蓋所有先前的值。


查看完整回答
反對 回復 2021-11-11
?
湖上湖

TA貢獻2003條經驗 獲得超2個贊

所以這里發生的事情是,Android 也在為您的自定義EditText實現處理狀態保存,這會覆蓋您的實現。由于您的CustomEdit實例列表是動態生成的,您可能不想依賴 Android 來保存視圖的狀態,因為它們沒有唯一的 ID。

由于您的CustomEdit膨脹custom_edit_text.xml(將EditTextID聲明為@+id/edit),這意味著CustomEdit您添加到布局中的每個都具有相同的內部 ID EditTextR.id.edit。由于它們都具有相同的 ID,因此每個視圖都會將其狀態保存到該 ID,因此保存其狀態的最后一個將最終成為恢復狀態時應用于所有視圖的文本。

您可以做兩件事來避免這種情況:

  1. 在你的custom_edit_text.xml,添加android:saveEnabled="false"EditText。這將阻止View保存that的狀態。這將是首選,因為它避免了做不必要的工作。

  2. onRestoreInstanceState()當前正在恢復視圖狀態的位置執行狀態恢復。


查看完整回答
反對 回復 2021-11-11
  • 2 回答
  • 0 關注
  • 211 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號