30

画面の3つの状態のフラグメントがあります。追加、編集、表示。[追加]で、エンティティを作成して保存します。次回は表示モードで開き、を使用してエンティティ名を設定します

EditText entityName = (EditText) view.findViewById(R.id.entityName);    
entityName.setText(entity.getEntityname());

表示モードから編集ボタンをクリックして、編集モードを開きます。ここでエンティティ名を変更して保存します。これにより、表示画面に戻ります。しかし、エンティティ名が更新されていないことがわかりました。デバッグしたところ、entity.getEntityname() 正しい値であることがわかりました。編集テキストが新しい値をとらない理由がわかりません。

何か案は?

注:私はAndroidバージョン2.2を使用しています

4

7 に答える 7

100

EditTextには、のテキストのリセットに問題があるようonCreateViewです。したがって、ここでの解決策は、のテキストをリセットすることですonResume。これは機能します。

また、onActivityCreatedにも問題があります。onStartでedittextのコンテンツをリセットすると、機能します。[@savepopulationへのクレジット]

于 2012-11-16T10:14:14.197 に答える
12

AndroidのViewには、コンテナがデタッチされたときにステータスを保存する必要があるクラスがいくつかあります。Fragment.onViewCreated()は、View.onSaveInstanceState()の前に呼び出す必要があります。したがって、メソッドFragment.onViewCreated()に値を設定した場合。値は、メソッドView.onRestoreInstanceState(Parcelable state)でクリアする必要があります。

たとえば、TextView、RecyclerViewなどをクラス化します。TextView.javaのコードを読み取ることができます。

    public Parcelable onSaveInstanceState() {
    Parcelable superState = super.onSaveInstanceState();

    // Save state if we are forced to
    final boolean freezesText = getFreezesText();
    boolean hasSelection = false;
    int start = -1;
    int end = -1;
    ....
    if (freezesText || hasSelection) {
        SavedState ss = new SavedState(superState);
        ....
    }
    ....
   }

状態を保存するかどうかを制御するパラメータがあります:「freezesText」と「hasSelection」。TextViewを選択できないため、hasSelectionはfalseです。関数、getFreezesText()は、TextViewクラスでもfalseを返します。したがって、TextViewは状態を保存しません。EditText.javaのコード:

    @Override
    public boolean getFreezesText() {
    return true;
    }

EditTextはtrueを返すため、EditTextは状態を保存する必要があります。

このバグを修正する方法がいくつかあります。

1. EditText.getFreezesText()を実装してfalseを返し、EditTextでselectの状態をクリアします

2. EditTextのonSaveInstanceStateを実装し、nullを返します。次のようになります。

 public Parcelable onSaveInstanceState() {
      super.onSaveInstanceState();
     return null;
 }

3. EditText.setSaveEnable(false);を使用します。

4.xmlにパラメータを追加します"saveEnable='false'"

于 2017-06-06T09:35:22.710 に答える
4

@TusharVengrulekarによると、これがフラグメントを実装する方法です。

public class ActionBar extends Fragment {

private TextView lbl_title;
private String title;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_action_bar, container, false);
    title = "Contacts";
    lbl_title = (TextView) view.findViewById(R.id.lbl_title);

    return view;
}

@Override
public void onStart(){
    super.onStart();

    lbl_title.setText(title);
}

@Override
public void onResume(){
    super.onResume();
}
}<!---->
于 2015-11-22T13:38:15.437 に答える
4

前述のように、EditTextにはonCreateViewのテキストのリセットに問題があるようです。

これは、フラグメントが作成されると、バックスタックからフラグメントを削除するまで、ビューが再度作成されないため、そのメソッドonResumeが呼び出されるためです。

したがって、ここでの解決策は、onResumeのテキストをリセットすることです。これは、そのフラグメントが開いているとき、または別のフラグメントから戻ってきているときに画面をロックおよびロック解除した場合でも、常に機能します

ただし、バンドルからこのデータを設定する場合は、インスタンス変数にその値を保存することをお勧めします。これにより、バンドルがnullになる可能性があり、nullポインタの問題が発生する可能性があります。

于 2015-11-22T13:51:50.627 に答える
3

また、に問題がありonActivityCreatedます。edittextのコンテンツをリセットするonStartと、機能します。

于 2015-01-21T12:18:16.293 に答える
1

これはフラグメント100%で機能します

  override fun onResume() {
    super.onResume()
    Handler(Looper.getMainLooper()).postDelayed({
       editText.setText("Abc")
    }, 500)

}
于 2022-02-02T06:04:10.877 に答える
0

onResume()または、オンonStart()のテキストをリセットすることは問題ありませんが、問題は、アプリがバックグラウンドに入ると、アプリケーションから期待される動作ではないいずれかのトリガーがトリガーされることです。テキストをリセットするために、このようなこともできます-EditTextpopBackStack()EditText

override fun onViewStateRestored(savedInstanceState: Bundle?) {
   super.onViewStateRestored(savedInstanceState)
   binding.coolEt.setText("xyz")
}
于 2021-08-12T11:09:56.347 に答える