【问题标题】:Trying to understand Android setText in onCreate of Activity with Fragment试图在带有 Fragment 的 Activity 的 onCreate 中理解 Android setText
【发布时间】:2014-02-06 17:47:25
【问题描述】:

如果我尝试在 Activity 的 onCreate() 中的 TextView 上设置文本,我总是会收到“不幸的是,XXX 已停止”。消息。

我以前通过在 onStart() 中执行任何 setText 代码来避免这种情况。一开始我以为这是因为你不应该在 onCreate() 中设置一个 UI 项,因为它还不可见,但我现在不这么认为了。

我想我现在需要在 onCreate() 中执行 setText,因为我想使用 savedInstanceState Bundle 进行屏幕方向翻转。

我有以下代码:

@Override
protected void onCreate (Bundle savedInstanceState)
{
    super.onCreate (savedInstanceState);
    setContentView (R.layout.activity_hmc);

    if (savedInstanceState == null)
    {
        getSupportFragmentManager().beginTransaction().add (R.id.container,new PlaceholderFragment()).commit();
    }
    else
    {
        // This line works, I see a Toast and the data from "output" is displayed.
        ShowToast (savedInstanceState.getString ("output"));

        // This line also executes without causing any issue.
        TextView tvOutput = (TextView) findViewById (R.id.textView4);
        // This line causes a "Unfortunately, XXX has stopped" error message.
        tvOutput.setText (savedInstanceState.getString ("output"));
    }
}

我想知道是不是因为我使用 Android Studio 创建的 Fragment 来保存我的 UI 组件。如果是这样,我需要将这个测试检索和setText代码放在下面的方法中吗?

public View onCreateView (LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState)
    {
        View rootView = inflater.inflate (R.layout.fragment_hmc,container,false);

        return rootView;
    }

我看到许多其他代码示例,其中人们在 Activity 的 onCreate 方法中的 UI 组件上使用 setText...大多数与此不工作有关的问题似乎与在调用 setText 之前未使用 setContentView 或未使用 findViewById 有关 -但你可以看到我正在做这两件事,希望是正确的。

那么 - 如果我使用 Fragment 来保存我的 UI 组件,这是否意味着我不能在 Activity 的 onCreate() 方法中对这些 UI 组件使用 setText?

非常感谢您帮助我更好地理解这一点...一旦教过我就会永远记住。

【问题讨论】:

  • 发布您的日志猫。 tvOutput 可能为空。

标签: android fragment oncreate settext


【解决方案1】:

您必须在 onCreateView 和 rootView 中初始化您的 TextView。因此,您的代码应如下所示:

public View onCreateView (LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState)
{
    View rootView = inflater.inflate (R.layout.fragment_hmc,container,false);

    TextView tvOutput = (TextView) rootView.findViewById (R.id.textView4);
    tvOutput.setText (savedInstanceState.getString ("output"));

    return rootView;
}

并从 MainActivity 中删除您的初始化;)

【讨论】:

  • 谢谢。当我将代码移动到 onCreateView 时 - savedInstanceState.getString ("output") 不会返回我知道已在 onSaveInstanceState 方法中放置在那里的数据。我可以在 Activity 的 onCreate() 方法中看到该数据,但在 onCreateView() 方法中看不到 - 它们不应该是相同的 Bundle savedInstanceState 吗?
  • 我认为片段有它自己的 savedInstanceState 和活动。因此,当您要保存和检索 Activity 的实例状态时,请保留 getString("output"); Activity 的 onCreate 中的命令。但是,当您需要片段中的“输出”字符串时,仅在片段中保存和检索 savedInsatnceState ;) 对不起我的英语:D
  • 我以为他们会是一样的savedInstanceState。所以,我需要做以下事情...... 1)将我的数据保存在onSaveInstanceState方法中。 2)在Activity的onCreate()方法中将该数据读回Strings并保存,3)在Fragment的onCreateView方法中对UI组件执行setText?附言- 我可以确认 setText 带有文字 'String` “hello” 在 Fragment 的 onCreateView 方法中有效......这比我预期的要繁琐一些。
  • 您可以将其存储在片段的已保存实例状态中;)这要容易得多;)
  • 谢谢,这行得通。我无法访问 Fragment 的 onSaveInstanceState 方法中的 View,所以我在 onCreateView 创建的类中创建了一个 View mRootView 变量,然后我可以在 onSaveInstanceState 中访问它以获得访问权限到我的TextView 和它的setText 方法。所以我在 Fragment 中保存事物的状态并在 Fragment 中检索它们。确认这一切正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多