从活动创建片段时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的主要内容,如果未能解决你的问题,请参考以下文章