从活动创建片段时getView返回null

Posted

技术标签:

【中文标题】从活动创建片段时getView返回null【英文标题】:getView returning null when fragment has been created from an activity 【发布时间】:2012-03-18 07:37:22 【问题描述】:

我有一个可以工作的平板电脑应用程序,现在我也在尝试在手机上进行工作。 在一张表上,屏幕上有两个片段,一个是列表片段,一个是细节片段。 在手机上时,列表片段会出现,并在按下列表项时创建一个新活动。 此活动只是在onCreate() 方法中创建片段并将其提交到屏幕,如下所示。

// Place an DeallDetailsFragment as our content pane
DealDetailsFragment f = new DealDetailsFragment();
getFragmentManager().beginTransaction().add(android.R.id.content, f).commit();
getFragmentManager().executePendingTransactions();

这按预期工作,但是在此活动中,我需要告诉片段要加载和显示哪些细节。在我的 DealDetailsFragment 类中,我有一个 updateDeal() 方法,它按如下方式更新内容。

if (deal==null)  // could be null if user presses the loading deals list item before it loads
    return;

this.deal=deal;
if (dealTitle==null)  // get the view objects only once
    holder = new ViewHolder();  
    holder.dealHeat=(TextView) getView().findViewById(R.id.dealDetails_heat_textView);
    holder.dealPrice=(TextView) getView().findViewById(R.id.dealDetails_price_textView);
    holder.dealRetailer=(TextView) getView().findViewById(R.id.dealDetails_retailer_textView);
    holder.dealTitle=(TextView) getView().findViewById(R.id.dealDetails_title_textView);
    holder.dealDesc=(TextView) getView().findViewById(R.id.dealDetails_desc_textView);
    holder.goToButton= (LinearLayout) getView().findViewById(R.id.dealDetails_goToDeal);
    holder.dealImage=(ImageView) getView().findViewById(R.id.dealDetails_imageView);
    holder.postedBy=(TextView) getView().findViewById(R.id.dealDetails_poster_textView);
    holder.datePosted=(TextView) getView().findViewById(R.id.dealDetails_date_textView);

getView() 在只显示一个片段的手机上运行应用程序时返回 null。

有什么想法吗?遗憾的是,网上提供的片段示例并不多。

【问题讨论】:

在 Fragment 生命周期的什么时候调用 updateDeal 方法? 片段创建和加载的时间。 具体是什么方法?创建?创建视图?开始? onResume? 目前在 onCreate。我在 onStart 也试过了。 查看以下主题:***.com/questions/14789519/… 【参考方案1】:

将您的方法调用移动到在onCreateView 期间执行,并使用您正在膨胀的视图作为参考而不是getView()。有关更多信息,请参阅片段生命周期:https://developer.android.com/guide/components/fragments.html#Creating

以及getView() 的文档解释了为什么它在onCreateView(LayoutInflater, ViewGroup, Bundle) 返回之前返回null:

getView() 获取片段布局的根视图(onCreateView(LayoutInflater, ViewGroup, Bundle) 返回的那个),如果提供的话。

https://developer.android.com/reference/android/app/Fragment.html#getView()

【讨论】:

完美!幸运的是,我只过了 1 小时就找到了这个答案:)。 以这种方式查找视图将提供一个新视图,但我想要相同视图的参考?? 知道为什么 getView() 可以返回 null,即使在 onCreateView() 被调用之后? @AndrewOrobator 确保您在生命周期中的onViewCreated() 期间或之后调用它。还要确保您在onCreateView() 期间实际上返回了一个非空视图。 你节省了我的时间。 :D【参考方案2】:

将方法移动到onCreateView() 对我没有帮助。所以...创建一个全局变量mView

protected View mView;

在 onCreateView() 中

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) 
  Log.d(TAG, "oncreateView");
  super.onCreateView(inflater, container, savedInstanceState);

  View view = inflater.inflate(R.layout.activity_secure_cloud_drive_folder, container, false);
  this.mView = view;
  return view;

并将您的所有getView() 替换为mView

【讨论】:

另外,在 onDetach() 方法中设置 mView = null 以避免内存泄漏 通过使用它,它在某些情况下变为 mView=null,由于 viewbyId 中的空点异常导致我的应用程序崩溃。应用程序在我的手机上运行良好,但我因此崩溃了 4%。关于如何防止这种情况的任何想法? 只调用getView()有什么区别?【参考方案3】:

您可以通过将代码放入您应该覆盖的onViewCreated()-方法中来解决此问题。别忘了打电话给super()

【讨论】:

不知何故这是最好的答案,但被低估了。如果它与通货膨胀无关,我不明白为什么要将代码放在 onCreateView 中。您应该认真一点,将“做 X 事情”替换为“将代码放入 onViewCreated 方法”。 在某些情况下,您需要在生命周期方法之外使用getView()【参考方案4】:

您必须检查 Android 生命周期以了解为什么它在 onAttach(...) 函数。

创建fragment时第一个调用的函数是onAttach(),但实际上并没有创建视图。这就是当您尝试在此调用中访问时返回 null 的原因。

下一个函数是onCreate()...但是还没有创建视图!!!!

第三个被调用的函数是onCreateView(),在这里你必须指出哪个是附加到这个片段的视图....而且只有在这个调用中存在视图对象并且可以访问。

阅读并了解整个生命周期here。

问候

【讨论】:

【参考方案5】:

因为 onCreate() 是在 onCreateView() 之前调用的,所以无论你是否在 onCreateView() 中为视图充气,你都不会通过 onCreate() 中的 getView() 得到任何东西,因为在那个时候,onCreate( ) 尚未调用

【讨论】:

我认为你应该添加一个来源或类似的东西:i.imgur.com/6Jl56FA.jpg【参考方案6】:

它变为 null 基本上是因为您在视图膨胀之前调用了getview()。创建一个View 对象并使用inflater 填充,然后找到您的UI 元素,请参见下面的代码

  View view = inflater.inflate(R.layout.fragment_albumslist, container, false);
        TextView t= (TextView)view.findViewById(R.id.txtTest);
        t.setText(strtext);
        return view;

【讨论】:

以上是关于从活动创建片段时getView返回null的主要内容,如果未能解决你的问题,请参考以下文章

ViewPager 中的片段在 getView() 中返回 null

如何从片段到活动而不会干扰片段的可重用性

Android,列表适配器在getView中返回错误的位置

如何从片段返回主要活动

Android:从片段调用时如何从活动中获取返回结果?

从其他活动返回到同一片段时,如何保存和恢复片段中 RecyclerView 的滚动位置?