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

Android 从活动创建片段时getView返回null,android,android-layout,android-intent,android-fragments,android-4.0-ice-cream-sandwich,Android,Android Layout,Android Intent,Android Fragments,Android 4.0 Ice Cream Sandwich,我有一个可以工作的平板电脑应用程序,我现在也在尝试在手机上工作。 在一个表上,屏幕上有两个片段:列表片段和详细信息片段。 在手机上,当按下列表项时,列表片段会出现并创建一个新的活动。 此活动只需在onCreate()方法中创建片段,并将其提交到屏幕,如下所示 // Place an DeallDetailsFragment as our content pane DealDetailsFragment f = new DealDetailsFragment(); getFragmentManag

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

// Place an DeallDetailsFragment as our content pane
DealDetailsFragment f = new DealDetailsFragment();
getFragmentManager().beginTransaction().add(android.R.id.content, f).commit();
getFragmentManager().executePendingTransactions();
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);
这是预期的工作,但是在这个活动中,我需要告诉片段要加载和显示哪些细节。在我的DealDetailsFragment类中,我有一个
UpdateDetail()
方法,该方法更新内容如下

// Place an DeallDetailsFragment as our content pane
DealDetailsFragment f = new DealDetailsFragment();
getFragmentManager().beginTransaction().add(android.R.id.content, f).commit();
getFragmentManager().executePendingTransactions();
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


有什么想法吗?遗憾的是,联机可用的片段示例不多。

onCreateView
期间移动要执行的方法调用,并使用正在膨胀的视图作为参考,而不是
getView()
。有关更多信息,请参阅片段生命周期:

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

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


将方法移动到
onCreateView()
对我没有帮助。因此。。。创建全局变量
mView

受保护视图mView;
在onCreateView()中

@覆盖
创建视图时的公共视图(LayoutFlater充气机、@Nullable ViewGroup容器、@Nullable Bundle savedInstanceState){
Log.d(标记“oncreateView”);
super.onCreateView(充气机、容器、保存状态);
视图=充气机。充气(R.layout.activity\u secure\u cloud\u drive\u文件夹,容器,false);
this.mView=视图;
返回视图;
}

然后将所有的
getView()
替换为
mView

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

创建片段时调用的第一个函数是onAttach(),但实际上尚未创建任何视图。这就是为什么当您尝试在此调用中访问时返回null

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

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

阅读并学习整个生命周期


问候语

您可以通过将代码放在
onViewCreated()
-方法中来解决这个问题,您应该覆盖该方法。不要忘了在它上面调用
super()

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

  View view = inflater.inflate(R.layout.fragment_albumslist, container, false);
        TextView t= (TextView)view.findViewById(R.id.txtTest);
        t.setText(strtext);
        return view;
因为onCreate()是在onCreateView()之前调用的,无论您是否在onCreateView()中膨胀视图,您都不会通过onCreate()中的getView()获得任何结果,因为在那时,onCreate()尚未被调用


在片段生命周期的什么时候调用UpdateDal方法?当片段被创建并加载时。具体是什么方法?一次创建?onCreateView?开始?onResume?当前在onCreate中。我也在onStart中试用过。请参阅以下主题:完美!幸运的是,在找到这个答案之前只有一个小时,这对我来说太难了:)。这样找到视图将提供一个新的视图,但我想要相同视图的引用??知道为什么getView()可以返回null,即使在调用onCreateView()之后?@AndrewOrobator确保在生命周期中的
onViewCreated()
期间或之后调用它。还要确保在
onCreateView()
期间实际返回的是非空视图。您保存了我的分钟数:有些人认为这是最好的答案,但却被低估了。我不明白,若代码和通货膨胀无关,为什么要将代码放在onCreateView中。你应该更认真一点,用“将你的代码放入onViewCreated方法”替换“做X-things”。有些情况下,你需要
getView()
在生命周期方法之外。我认为你应该添加一个源代码或类似的东西:另外,在OnDetch()方法中设置mView=null以避免内存泄漏,在某些情况下,它变为mView=null,这会由于viewbyId中的null点异常而导致我的应用程序崩溃。该应用程序在我的手机上运行良好,但由于这个原因,我的崩溃率达到了4%。你知道如何防止这种情况吗?只调用
getView()
有什么区别吗?