【问题标题】:textview resets every time i come back to the app每次我回到应用程序时,textview 都会重置
【发布时间】:2023-08-05 21:14:01
【问题描述】:

我是 android 开发的新手,我必须做一个应用程序来检查在前台运行的应用程序,它应该使用应用程序的名称更新一个 textview。目前我使用的是字符串,因为我无法从可运行的内部类中引用非最终变量。

我已将我的代码放入一个 Runnable 类中,放入我的主要活动的 oncreate 方法中,不知道它是否是放置它的正确位置,因为我想运行一次,然后让线程完成他的工作无限循环。

我发现的几个问题之一是当我运行我的应用程序时,每次我回到应用程序时,textview 都是空的,然后线程开始用我的字符串填充它,但是当我离开应用程序并来时再回来,是空的。

如何保留 textview 的内容?

我把我的代码放在这里,谢谢你的帮助。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (!bExecuted)
    {
        bExecuted = true;

        setContentView(R.layout.activity_main);

        final TextView myText = (TextView) this.findViewById(R.id.my_view);
        final ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
        final PackageManager pm = this.getPackageManager();

        Runnable myRunnable = new Runnable() {
             @Override
             public void run() {

                 String foregroundTaskAppName = "";
                 String foregroundTaskAppNameOld = "";

                 while (true) 
                 {
                     try
                     {
                         Thread.sleep(500);
                        // The first in the list of RunningTasks is always the foreground task.
                        RunningTaskInfo foregroundTaskInfo = am.getRunningTasks(1).get(0);

                        String foregroundTaskPackageName = foregroundTaskInfo .topActivity.getPackageName();

                        PackageInfo foregroundAppPackageInfo;

                        foregroundAppPackageInfo = pm.getPackageInfo(foregroundTaskPackageName, 0);

                        foregroundTaskAppNameOld = foregroundTaskAppName;
                        foregroundTaskAppName = foregroundAppPackageInfo.applicationInfo.loadLabel(pm).toString();

                        if (!foregroundTaskAppNameOld.equals(foregroundTaskAppName))
                        {
                            myText.post(new Runnable() { 
                                @Override
                                public void run() {
                                    String textOld = (String)myText.getText();
                                    myText.setText(textOld + "hol\n");
                                }
                            });
                        }

                    } catch (NameNotFoundException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                  }
             }
        };

        Thread myThread = new Thread(myRunnable);
        myThread.start();
    }
}

【问题讨论】:

  • 如果你的意思是“回来”,你只是暂停你的应用程序,那么我认为你也必须在 onRestart 中做这些事情。但是如果您关闭应用程序,您可以将最后一个字符串存储在 sharedPreferences 中

标签: android textview reset foreground


【解决方案1】:

您需要的是适当的生命周期管理,当 Activity 停止运行时会进入暂停状态,您需要的是当它再次返回时重新创建 Activity。

由于您是 android 新手,而不是提供已实现的代码,我建议您在Adnroid Developer 中阅读有关它的信息,这样您将了解更多信息,如果您在阅读建议的链接后仍无法了解,请执行让我知道我会提供帮助。

【讨论】:

  • 它说“为了让 Android 系统恢复活动中视图的状态,每个视图必须有一个唯一的 ID,由 android:id 属性提供”。这意味着如果我的 textview 有一个 id 我不必什么都不做?谢谢
  • 如果有ID,android会恢复。但要保留对象和其他已处理数据等值,您需要使用 APIS,例如 saveInstanceState 和 restoreInstanceState。
  • 我遇到了一个问题,当用户在平板电脑上按回时不会调用 onSaveInstanceState。我可以使用哪个事件&
【解决方案2】:

一旦 TextView 被更改,它不会在您的应用程序被终止后保存。 你需要的是使用Android的保存状态,或者使用这个:

save value:
sharedpreferences sp = getSharedPreferences("Name Your data Base", Context.MODE_PRIVATE);
sp.edit().putString("NameOfVar" , "value").commit();

load value: 
sharedpreferences sp = getSharedPreferences("Name Your data Base", Context.MODE_PRIVATE);
String loadedValue = sp.getString("NameOfVar" , "Default Value");

祝你好运!

【讨论】:

  • 在 sharedpreferences 中找不到 putString 方法。感谢您的回答
  • 对不起,它的 sp.edit().putString("NameOfVar" , "value").commit();