【问题标题】:Refreshing visible text of a TextView in a Fragment without recreating entire Activity?在不重新创建整个活动的情况下刷新片段中 TextView 的可见文本?
【发布时间】:2014-06-17 20:11:48
【问题描述】:

在开发我的应用程序时,我在“修复错误”时遇到了一些问题

在我的 MainActivity 的 onCreate() 方法中,正在启动 1 个服务和 1 个活动。 他们收集数据(服务中的 3 个字符串,其他活动中的 1 个字符串),我使用 onAvitivityResult 方法来完成这项工作。因为我使用一个活动而不是单个服务,所以看起来一个窗口正在快速进出(服务和活动都运行 AsyncTasks),我不太喜欢这样。

我基本上已经重新编码了所有内容以适应一个服务中的所有内容,并将结果传递给另一个类,该类将字符串传递回 MainActivity。我正在使用默认预设(swipeViews),现在片段只显示我分配给它的字符串,很好,但是我的服务正在更新该字符串,但 textView 本身没有。

如何让我的 textView ("textView1") 刷新并显示新字符串 ("ClassC.datumh") 而无需重新创建整个 MainActivity?

这里只是输出方法的一个sn-p

@Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_main, container, false);
            TextView textView1 = (TextView) rootView.findViewById(R.id.section_label);
            textView1.setText(ClassC.datumh); //some random string that comes out of the service          
            rootView.invalidate();
            return rootView;
        }

之前我曾经简单地重新创建 MainActivity,但如前所述,我不太喜欢由此创建的“弹出”效果..

【问题讨论】:

  • 问题真的是TextView 没有更新还是static 成员ClassC.datumh 没有正确的值,或者Activity1 没有收到值已更新的通知?
  • 我相信该方法/活动没有通知该值已更新。编辑:即使它会收到通知并更改 textview 的值,textview 也不会自行更新,因此仍然显示旧字符串..
  • 创建一个 TextView 的实例变量,并在 onActivityResult 从那里更改 TextView。 (将 TextView 带到 onCreateView 之外)
  • nonono 你不明白,我没有 onActivityResult 了,因为我现在完全依赖服务。但是,我的 textView 的实例变量是什么意思?
  • 您的Service 是否改为发送Intent?您可以收到 Intent 作为事件。

标签: android textview


【解决方案1】:

onCreateView 仅在创建视图时调用。您不想重新创建 TextView,只需更新其文本即可。

使 textView1 成为 MainActivity 中的实例变量。当 MainActivity 从 Service 接收到字符串时,让它运行

textView1.setText(newStringReceivedFromYourService);

【讨论】:

  • 给我的文本视图分配一个字符串不是我的问题。问题是,在我的服务完成并且我的 textview 得到一个新值之后,除非重新创建整个片段,否则它不会刷新。
  • 您的服务如何返回字符串?您确定 MainActivity 已收到新字符串吗?尝试调试以确认。你不应该重新创建 TextView,setText 会立即更新值。
  • 是的,我确定。预设创建了 4 个片段,我可以通过在屏幕上水平滑动来访问,如果我运行我的应用程序并滚动两次到第 4 页右侧的页面,正确的字符串最终会出现,因为服务在实际片段之前完成textview 已创建,因此分配了新字符串。如果我然后滚动回到开头,那么途中的所有片段似乎也正在重新创建,并且所有片段都有正确的字符串!
  • 等等,分配新值没有问题!只是即使值已更新,用户也不会看到它,除非我重新启动整个 Activity..这就是我想说的..
  • 你的值更新到哪里了? MainActivity 或 ClassC.datumh 中的变量?如果是这样,调用 textView1.setText(variableWithUpdatedText) 来更新视图的文本,用户将立即看到它。您不应为此重新创建活动。
【解决方案2】:

重新初始化整个 ViewPager 完成了这项工作。它重新创建了 TextViews 就好了,我能够看到新的值

ClassC.mViewPager.setAdapter(MainActivity.mMyFragmentPagerAdapter);

为了在我检索字符串的服务中工作,我必须在另一个类 (ClassC) 中将 ViewPager 设为静态,因此我可以在任何给定时间访问它。

【讨论】:

    猜你喜欢
    • 2020-12-24
    • 1970-01-01
    • 2020-12-23
    • 1970-01-01
    • 2014-10-18
    • 2021-12-04
    • 2023-04-01
    • 2018-02-04
    • 1970-01-01
    相关资源
    最近更新 更多