Java “后退”按钮可恢复修改的文本视图

Java “后退”按钮可恢复修改的文本视图,java,android,Java,Android,我将简化我的代码以专门解决此问题: 我有一个带有一些文本视图的活动A,在活动的OnCreate方法中,文本被设置为存储在SharedReferences中的某些键值。每个文本视图旁边都有一个按钮。单击按钮时,将打开一个新的活动B,其中显示具有不同文本字符串的适配器。当用户单击其中一个时,新字符串将存储在首选项中,并通过意图将用户定向回活动A,因此将调用OnCreate方法,并使用所选文本更新textview。这很好用 然而,我的问题是: 当用户执行此操作并更新textview时,如果按一次“后退

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

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

然而,我的问题是: 当用户执行此操作并更新textview时,如果按一次“后退”按钮,则会将其带到活动B,但如果按两次,则会将其带到活动a,然后再更新textview,从而显示旧的textview,尽管已将更新的值存储在SharedReferences中。如何解决这个问题

我的问题的一个更简化的版本是,我的布局中有一个文本视图,还有一个按钮,如果按下,它将删除并刷新活动。用户按下删除按钮,文本视图消失,但按下后退按钮,文本视图恢复。这就是我不想要的

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

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

活动B(呼叫适配器)

活动B中的适配器(选中文本时单击侦听器)


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

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

存储

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", "");
检索

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);
}

活动B
的方式是通过在前面重新启动活动,而不是通过
onBackPressed()
导航,导航回
活动A
。此外,如果导航是更新
字符串
值的一个重要组件,则建议使用
startActivityForResult()
并在
活动A的
onActivityResult()
上更新首选项和
文本视图

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); 
         } 
     }

}
活动b
中,您可以

class ActivityB extends AppCompatActivity {
    public static final int resultSuccess = 0x11
    public static final int resultFailure = 0x33
    public static final String resultKey = "keyForResult"         

    private void onListItemClick(final String soundString) {
        // optional you can also do this
        SharedPrefUtils.saveString(ActivityA.keyPref, soundString);

        // better to do this
        final Intent returnIntent = getIntent() != null ? getIntent() : new Intent();

        returnIntent.putExtra(resultKey, soundString);
        if (getCallingActivity() != null) {
            setResult(returnIntent, resultSuccess);
        }
        onBackPressed();
    }
}

我想你需要完成这项工作。只需初始化
finish()星后触觉(意图)@Sayem Yes!!我已经重写了OnButEnter按钮来完成这个活动,这是不工作的,所以我没有考虑只是添加完成后的意图,非常感谢!好的,我明白你在做什么了,我以前从未使用过startActivityForResult(),现在我更了解它的工作原理以及为什么要使用它。但是,我可以通过在计划完成后拨打finish来解决我的问题,这样back(后退)按钮就不会再把我带到旧版本的活动了,(我认为back(后退)按钮就是这么做的,但显然它不会直接完成活动,只有在手机需要内存的情况下)是的,这是出于设计,因为您可能在上一个活动中已有引用,如果需要再次引用,则不必经历重新创建周期。手动调用finish()会导致生命周期的结束,方法是随后对该活动及其包含的片段调用onDestory()。因此,您必须谨慎使用它,否则最终可能会出现悬空或空指针引用
class ActivityB extends AppCompatActivity {
    public static final int resultSuccess = 0x11
    public static final int resultFailure = 0x33
    public static final String resultKey = "keyForResult"         

    private void onListItemClick(final String soundString) {
        // optional you can also do this
        SharedPrefUtils.saveString(ActivityA.keyPref, soundString);

        // better to do this
        final Intent returnIntent = getIntent() != null ? getIntent() : new Intent();

        returnIntent.putExtra(resultKey, soundString);
        if (getCallingActivity() != null) {
            setResult(returnIntent, resultSuccess);
        }
        onBackPressed();
    }
}