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

ben*_*lis 58 android android-intent android-layout 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();
Run Code Online (Sandbox Code Playgroud)

这是按预期工作的,但是从这个活动中我需要告诉片段要加载和显示的细节.在我的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);
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗?不幸的是,网上没有很多片段示例.

Jas*_*son 124

移动您的方法调用以在执行期间执行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()

  • @AndrewOrobator确保你在生命周期中`onViewCreated()`期间或之后调用它.还要确保在`onCreateView()`期间实际返回非null视图. (5认同)
  • 知道为什么 getView() 可以返回 null,即使在 onCreateView() 被调用之后? (3认同)
  • 以这种方式查找视图将提供一个新视图,但我想要相同视图的引用? (2认同)

spa*_*key 22

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

 protected View mView;
Run Code Online (Sandbox Code Playgroud)

并在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;
}
Run Code Online (Sandbox Code Playgroud)

和替换所有getView()mView

  • 另外,在onDetach()方法中设置mView = null以避免内存泄漏 (3认同)
  • 与仅调用“getView()”有什么区别? (2认同)

Joa*_*huk 8

你可以通过将代码放在onViewCreated()-method中来解决这个问题,你应该覆盖它.别忘了给super()它打电话.


小智 5

您必须检查 Android Lifecycle 以了解为什么 onAttach(...) 函数为 null。

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

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

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

在此处阅读并了解完整的生命周期。

你好