【问题标题】:Save EditText value onResume()保存 EditText 值 onResume()
【发布时间】:2017-04-20 19:54:44
【问题描述】:

我正在尝试在旋转设备时保存 EditText 的值。 我正在使用 Firebase 数据库来保存和获取我的值。

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


    ValueEventListener postListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Post post = dataSnapshot.getValue(Post.class);
            if (mPostKey != null) {
                titleEditText.setText(post.getTitle());
                notesEditText.setText(post.getNotes());
            } else {
                titleEditText.setText(prefs.getString("titleText", post.getTitle()));
                notesEditText.setText(prefs.getString("notesText", post.getTitle()));
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    };
    mPostReference.addValueEventListener(postListener);
    mPostListener = postListener;
}

仅当该值尚未存储在 Firebase 中时才有效。

@Override
protected void onResume() {
    super.onResume();
    prefs.edit().putString("titleText", titleEditText.getText().toString()).commit();
    prefs.edit().putString("notesText", notesEditText.getText().toString()).commit();

}

我可以在清单中设置方向更改,但如果这样做,当我向活动添加照片时,我仍然会丢失文本。

我也尝试过像这样在 super.onResume() 之前和之后删除监听器:

@Override
public void onResume() {
    super.onResume();
    if (mPostListener != null) {
        mPostReference.removeEventListener(mPostListener);
    }

}

感谢任何帮助。

【问题讨论】:

  • 你能给我举个例子吗,因为我也试过这样做,但没有成功。

标签: android firebase firebase-realtime-database activity-lifecycle


【解决方案1】:

您是否尝试过使用此覆盖功能

public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        if (newConfig.orientation== Configuration.ORIENTATION_PORTRAIT)
        {

        }
        else  if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE)
        {

        }
    }

【讨论】:

    【解决方案2】:

    为此目的最好使用savedInstaceState()。示例:

    // This function will invoked when rotation detected
    @Override
        public void onSaveInstanceState(Bundle outState) {
        outState.putString("titleText", titleEditText.getText().toString());
        outState.putString("notesText", notesEditText.getText().toString());
        super.onSaveInstanceState(outState);
    }
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        // this will restore it
        if (savedInstanceState != null) {
            titleEditText.setText(savedInstanceState.getString("titleText"));
            notesEditText.setText(savedInstanceState.getString("notesText"));
    
         }
    }
    

    我认为这更好,因为它永远不会像 SharedPreferences 那样保存它

    【讨论】:

    • 这仅在数据库为空时有效。如果不是,它会用来自 firebase 的值覆盖它。有什么建议吗?
    【解决方案3】:

    我已经开始工作了。如果有更好的答案,请与我分享。

    @Override
    protected void onStart() {
        super.onStart();
    
        mPostReference.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                Post post = dataSnapshot.getValue(Post.class);
                if (mPostKey != null) {
                    titleEditText.setText(post.getTitle() + prefs.getString("titleText", post.getTitle()));
                    notesEditText.setText(post.getNotes() + prefs.getString("notesText", post.getTitle()));
                } else {
                    titleEditText.setText(prefs.getString("titleText", post.getTitle()));
                    notesEditText.setText(prefs.getString("notesText", post.getTitle()));
                }
            }
    
            @Override
            public void onCancelled(DatabaseError databaseError) {
    
            }
        });
    
    }
    

    在 onResume 中

       @Override
    protected void onResume() {
        super.onResume();
        prefs.edit().putString("titleText", titleEditText.getText().toString()).apply();
        prefs.edit().putString("notesText", notesEditText.getText().toString()).apply();
    
    }
    

    编辑

    如果我在文本前面进行编辑,此方法无法正确设置文本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-05
      相关资源
      最近更新 更多