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

时间:2012-02-28 19:44:37

标签: 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();
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。

有什么想法吗?遗憾的是,网上没有很多片段示例。

6 个答案:

答案 0 :(得分:122)

移动您的方法调用以在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 :(得分:21)

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

 protected View mView;

并在onCreateView()

 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 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

答案 2 :(得分:8)

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

答案 3 :(得分:4)

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

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

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

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

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

问候

答案 4 :(得分:1)

它变为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;

答案 5 :(得分:1)

因为在onCreateView()之前调用onCreate(),无论你是否在onCreateView()中膨胀一个视图,你都无法通过onCreate()中的getView()得到任何东西,因为在那个时候, onCreate( )尚未被召唤

Android Lifecycle