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

     2023-04-19     60

关键词:

【中文标题】从活动创建片段时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().findViewById(R.id.box1) 返回 null

】片段getView().findViewById(R.id.box1)返回null【英文标题】:FragmentgetView().findViewById(R.id.box1)Returningnull【发布时间】:2014-04-3022:46:15【问题描述】:所以这就是问题所在。我正在编写一个应用程序,其中一个片段和一个按钮中有两个Ed... 查看详情

活动结果相机意图在三星 s4 中返回 null

】活动结果相机意图在三星s4中返回null【英文标题】:onactivityresultcameraintentreturnnullinsamsungs4【发布时间】:2015-11-0619:37:33【问题描述】:在此先感谢您的帮助。这是我在创建第一个应用程序时面临的问题。我正在制作应用程序... 查看详情

convertView.FindViewById 在 adapter.GetView 中返回 null

】convertView.FindViewById在adapter.GetView中返回null【英文标题】:convertView.FindViewByIdreturnsnullinadapter.GetView【发布时间】:2020-01-1123:25:18【问题描述】:我正在尝试在Android应用程序中显示日志项列表,但是每当我调用convertView.FindViewByID... 查看详情

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

】Android:从片段调用时如何从活动中获取返回结果?【英文标题】:Android:HowtogetreturnresultfromactivitywhencallingfromFragment?【发布时间】:2013-09-2709:18:29【问题描述】:我有一个Fragment使用以下方式调用另一个Activity:ProductEditionMainten... 查看详情

如何从片段返回主要活动

】如何从片段返回主要活动【英文标题】:HowcanIgobacktomainactivityfromaFragment【发布时间】:2021-03-0415:33:09【问题描述】:我成功实现了底部导航抽屉并使用了片段。现在我可以从抽屉菜单中切换片段。我的问题是,当我从抽屉菜... 查看详情

传递对象在活动意图中返回 null

】传递对象在活动意图中返回null【英文标题】:PassingObjectreturnsnullinacitivityintent【发布时间】:2017-10-1504:33:13【问题描述】:我正在尝试通过意图将数据从活动发送到其他活动。发送String或integer工作得很好。但是当我以相同的... 查看详情

从父活动调用时,片段视图为空

】从父活动调用时,片段视图为空【英文标题】:FragmentViewisNullWhenCalledFromParentActivity【发布时间】:2020-04-0910:00:54【问题描述】:我有一个带有LinearLayout的活动及其子片段,我在其中生成按钮。创建片段后,一切运行正常。但... 查看详情

Android:从相机返回后创建新活动,而不是返回到以前的活动

】Android:从相机返回后创建新活动,而不是返回到以前的活动【英文标题】:Android:newactivityiscreatedafterreturningfromcamerainsteadofreturningtopreviousactivity【发布时间】:2012-06-0911:43:13【问题描述】:我有一个活动A,您可以在其中按下一... 查看详情

单击按钮时刷新片段视图

...前片段通信),除了我无法刷新片段视图这一事实。通过getView()访问当前视图不起作用,因为此函数返回 查看详情

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

】从其他活动返回到同一片段时,如何保存和恢复片段中RecyclerView的滚动位置?【英文标题】:HowtosaveandrestorescrollingpositionoftheRecyclerViewinafragmentwhencomingbackfromotheractivitytothesamefragment?【发布时间】:2019-03-0608:45:07【问题描述】:... 查看详情

从片段返回主页活动而不启动新活动(主页)

】从片段返回主页活动而不启动新活动(主页)【英文标题】:GoingbacktoHomeActivityfromfragmentwithoutstartingthenewAcivity(HomePage)【发布时间】:2016-09-2004:29:03【问题描述】:我有一个列出人员的片段。它在(主)活动中调用,该活动在Pe... 查看详情

Android findFragmentByTag 调试时返回null

...多个片段之一填充。相对而言,我需要将一组数据传递给活动片段,以便它可以相应地更新UI。为了获取当前片段,我调用getfragmen 查看详情

创建您自己的自定义适配器时,getView() 方法如何工作?

】创建您自己的自定义适配器时,getView()方法如何工作?【英文标题】:HowdoesthegetView()methodworkwhencreatingyourowncustomadapter?【发布时间】:2012-04-2414:16:55【问题描述】:我的问题是:LayoutInflater的具体作用是什么?为什么我读过的... 查看详情

如果我关闭活动,从 BroadcastReceiver.onReceive 调用 peekService 将返回 null

】如果我关闭活动,从BroadcastReceiver.onReceive调用peekService将返回null【英文标题】:CallingpeekServicefromBroadcastReceiver.onReceivereturnsnullifIclosetheactivity【发布时间】:2015-02-0520:34:10【问题描述】:问题我为Android4.3编写了一个程序,其中... 查看详情

使后退按钮从活动返回到Android中的片段

】使后退按钮从活动返回到Android中的片段【英文标题】:MakebackbuttonreturnsfromanactivitytoafragmentinAndroid【发布时间】:2016-10-1408:10:52【问题描述】:我正在开发一个Android应用程序,我有一个名为“更多”的片段,在这个片段中我有... 查看详情

重新创建我的活动时,为啥我的 savedInstanceState 为 Null?

】重新创建我的活动时,为啥我的savedInstanceState为Null?【英文标题】:WhyismysavedInstanceStateNullwhenrecreatingmyactivity?重新创建我的活动时,为什么我的savedInstanceState为Null?【发布时间】:2014-06-0716:41:52【问题描述】:我通读了Activit... 查看详情

Android片段-findViewById返回null [重复]

...联网上似乎很常见的问题:我创建了一个只有一个片段的活动。这是生成的代码:@OverrideprotectedvoidonCreate(BundlesavedInstanceState) 查看详情

从意图返回时Android UI元素为空

...问题描述】:我在片段中添加了一个按钮来启动一个新的活动。它可以工作,但是当从意图返回时,我无法再访问ui元素(来自保存片段的活动)-它们为空。处理此设置的正确方法是什么?我怀疑这个问题与活动生命周期有关。... 查看详情