后退按钮可还原修改后的文本视图

时间:2018-06-21 13:57:40

标签: java android

我将简化代码以专门解决该问题:

我有一个带有一些TextView的活动A,该文本在该活动的OnCreate方法中设置为存储在SharedPreferences中的某些键值。每个textview旁边都有一个按钮。单击按钮后,它将打开一个新的活动B,该活动B显示带有不同文本字符串的适配器。当用户单击一个时,新的字符串将存储在首选项中,并通过一个意图将用户定向回活动A,因此将调用OnCreate方法,并使用所选文本更新textview。效果很好。

但是,我的问题是: 当用户执行此操作并更新textview时,如果他们按一次“返回”按钮,它将带他们进入活动B,但是如果按两次,这会将他们带到Activity A,然后更新TextView并因此显示旧的textview,尽管已经存储了在SharedPreferences中更新的值。如何解决?

我的问题的一个更简化的版本是,我的布局中有一个TextView,还有一个按钮,如果按下该按钮,它将删除它并刷新Activity。用户按下删除按钮,文本视图消失,但随后按下返回按钮,TextView恢复。那就是我所不想要的。

我已经研究了所有后退按钮方法和saveInstanceState文档,但仍然没有找到可行的方法。我还尝试在操作栏中添加UpNavigation按钮,但其效果与后退按钮相同。

活动A(所有这些代码位都在OnCreate中调用)

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);

    String sound1name = prefs.getString("sound1", "1");

TextView sound1TV = findViewById(R.id.sound1);
    sound1TV.setText(sound1Name);

 ImageView sound1btn = findViewById(R.id.sound1_btn);
    sound1btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent1 = new Intent(getApplicationContext(), SoundSelector.class);

            startActivity(intent1);
        }
    });

活动B(呼叫适配器)

AudioFileAdapter aFilesAdapter = new AudioFileAdapter(SoundSelector.this, audioFileList, soundID);
    ListView listView = findViewById(R.id.sounds_list);
    listView.setAdapter(aFilesAdapter);

活动B中的适配器(选择文本后为OnClickListener)

SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(contextL);
                    SharedPreferences.Editor editor = settings.edit();
                    editor.putString("sound1", sound1string);
                    editor.apply();
                    Intent intent1 = new Intent(getContext(), SoundEditor.class);
                    con.startActivity(intent1);

我不确定这是否是我必须修改的活动生命周期,意图或其他东西,但是如果有人可以向我指出正确的方向,那么我将非常感激,如果您需要更多信息或代码,我会尽快发布。

2 个答案:

答案 0 :(得分:0)

要存储和检索共享首选项,请尝试以下操作:

存储

SharedPreferences preferences = getSharedPreferences("com.appname", Context.MODE_WORLD_WRITEABLE);
SharedPreferences.Editor editor = preferences.edit();
editor.putString("sound1", "YOUR STRING HERE");
editor.apply();

正在检索

SharedPreferences prfs = getSharedPreferences("com.appname", Context.MODE_PRIVATE);
String soundString = prfs.getString("sound1", "");

您的意图看起来不错,您确定要传递活动A的名称吗?

对于第二种情况,您可以存储是否在共享首选项中删除了文本视图,因此当按下后退按钮时,它将不会在上一个活动中再次显示。

类似这样的东西

if (isDeleted.equals("Yes")) {
   textView.setVisibility(View.INVISIBLE);
}

答案 1 :(得分:0)

通过Activity B导航而不是Activity A导航来重新导航到onBackPressed()。此外,如果导航是更新string值的重要组成部分,那么推荐的方法是使用startActivityForResult()并在{{的TextView上更新首选项和onActivityResult() 1}}

Activity A

class ActivityA extends AppCompatActivity { private static final int activityRequest = 0x22; public static final String keyPref = "keyToSharedPrefData"; private TextView mTextView; private boolean isHidden = false; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.a_activity); mTextView = findViewById(R.id.someTextView); final String textForTextView = SharedPrefUtils.getString(keyPref); mTextView.setText(textForTextView); final Button button = findViewById(R.id.someButton); if (button != null) { button.setOnClickListener((view) -> { final Intent intent = new Intent(ActivityA.this, AcitivtyB.class); startActivityForResult(intent, activityRequest); }); } final deleteButton = findViewById(R.id.delete_button); if (deleteButton != null) { deleteButton.setOnClickListener((view) -> { mTextView.setText(""); isHidden = true; }); } } @Override public void onActivityResult(int requestCode, int resultCode, Intent data){ if (requestCode == activityRequest && resultCode == ActivityB.resultSuccess && data != null) { if (data.containsKey(ActivityB.resultKey)) { SharedPrefUtils.saveString(keyPref, data.getString(ActivityB.resultKey, SharedPrefUtils.getString(keyPref)); if (mTextView != null) { mTextView.setText(SharedPrefUtils.getString(keyPref)); } } } if (isHidden) { mTextView.setVisibility(View.GONE); } } } 中可以

ActivityB