【问题标题】:NullPointerException in Fragment's onCreateView() methodFragment 的 onCreateView() 方法中的 NullPointerException
【发布时间】:2013-02-18 13:45:54
【问题描述】:

我的代码:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // t-alk és impresszumhoz
    LinearLayout layout = (LinearLayout) getActivity().findViewById(
            R.layout.impresszum);
    ((TextView) layout.findViewById(R.id.impresszumtext1)).setText(" v.");...

这是一个fragment的oncreateview方法,我在最后一行有一个nullpointerexception

03-04 13:48:20.149: E/AndroidRuntime(32586):    at com.myapp.TestFragment.onCreateView(TestFragment.java:53)

这里是整个 onCreateView():

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        // feltételekhez és folyamatokhoz
        WebView wv = new WebView(getActivity());
        FrameLayout flayout = new FrameLayout(getActivity());

        flayout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
                LayoutParams.MATCH_PARENT));
        flayout.setBackgroundResource(R.drawable.gradient_gray_light);

        wv.setInitialScale(100);
        wv.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);
        wv.setBackgroundColor(getResources().getColor(R.color.transparent2));
        wv.setPadding(5, 5, 5, 5);

        wv.setWebViewClient(new WebViewClient() {
            public void onReceivedError(WebView view, int errorCode,
                    String description, String failingUrl) {
                Toast.makeText(getActivity(), description, Toast.LENGTH_SHORT)
                        .show();
                Toast.makeText(getActivity(), "Hiba történt a betöltés során",
                        Toast.LENGTH_LONG).show();
            }

            @Override
            public void onPageFinished(WebView view, final String url) {

                progressDialog.cancel();

            }

            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                progressDialog = ProgressDialog.show(getActivity(), "",
                        "Loading...");
                progressDialog.setCancelable(true);
                progressDialog.setCanceledOnTouchOutside(false);
            }
        });

        // feltételek
        if (mContent.equalsIgnoreCase("Feltételek")) {
            getActivity().getWindow().setFormat(PixelFormat.RGBA_8888);
            wv.loadUrl("file:///android_asset/conditions.htm");
            flayout.addView(wv);
            return flayout;

        }
        // folyamatok
        else if (mContent.equalsIgnoreCase("Folyamatok")) {
            getActivity().getWindow().setFormat(PixelFormat.RGBA_8888);
            wv.loadUrl("file:///android_asset/process.htm");
            flayout.addView(wv);
            return flayout;
        }
        // T-alkalmazások
        else if (mContent.equalsIgnoreCase("T-alkalmazások")) {

        }
        // Impresszum
        else if (mContent.equalsIgnoreCase("Impresszum")) {

            final String TAG = "Impresszum";
            String versionName;
            String appName;

            appName = getResources().getString(R.string.app_name);
LinearLayout layout = (LinearLayout) getActivity().findViewById(
                R.layout.impresszum);
            try {

                versionName = getActivity().getPackageManager().getPackageInfo(
                        getActivity().getPackageName(), 0).versionName;


        ((TextView)layout.findViewById(R.id.impresszumtext1)).setText(appName
                 + " v." + versionName);


            } catch (NameNotFoundException ex) {
                Log.e(TAG + ".1", "error: " + ex.getMessage(), ex);
            }
            return layout;
        }


        return layout;
    }

我正在使用 ViewPagerIndicator。

【问题讨论】:

  • 你确定getActivity() 没有返回null?您的impresszum 布局中是否有 ID 为 impresszumtext1 的文本视图?
  • 我检查过,你是对的,getactivity() 返回 null。很痛……但是谢谢!

标签: android android-fragments view nullpointerexception


【解决方案1】:

以下是 Fragment 生命周期的内部结构:


FragmentManager 为执行state transitionFragment 设置活动值:

f.mActivity = mActivity;
f.mFragmentManager = mActivity.mFragments;
f.mCalled = false;
f.onAttach(mActivity);

此外,它在分离Fragment 后将此值设置为空:

f.mCalled = false;
f.onDetach();

. . .

f.mActivity = null;
f.mFragmentManager = null;

因此,如果其他一切正常,该值不应为空,介于 onAttach()onDetach() 之间。


为安全起见,请将所有此类代码移至onActivityCreated()

【讨论】:

  • 那么 getActivity() 怎么可能返回 null?
  • @keybee getActivity() 在正常的 Fragment 使用中此时不会返回 null。如果它确实返回null,则意味着Fragment 未附加到Activity,您应该添加有关如何使用Fragment 解决问题的更多详细信息。你确定getActivity() 正在返回null
  • 我把它放在 onCreateView() 方法的开头: if (getActivity() != null) { Toast.makeText(getActivity(), "nem null", Toast.LENGTH_LONG).show (); } else { Toast.makeText(getActivity(), "null", Toast.LENGTH_LONG).show(); } 我在 else 部分得到了一个 NPE
  • @keybee 好的,您如何在ViewPager 中使用Fragment,这是您手动添加的简单片段等? @User117 如果我没记错的话,该字段是由 FragmentManager 设置的。
  • 我添加了 onCreateView() 的源代码 - getActivity() 在其他任何地方都可以正常工作,我正在使用 ViewPagerIndicator。
【解决方案2】:

首先我需要扩展布局,以便能够使用 findViewById() 。

终于解决了:

这不是必需的:

LinearLayout layout = (LinearLayout) view
                .findViewById(R.layout.impresszum);

应该改用这个:

View view = inflater.inflate(R.layout.impresszum, container, false);

还有这一行的另一个修改:

((TextView) **view**.findViewById(R.id.impresszumtext1))
                        .setText(appName + " v." + versionName);

我也找到了一些解释: 如果我的想法是正确的,首先我需要扩展布局,以便能够使用“findViewById”访问对象...这是偷偷摸摸的,因为 setcontentview() 为我们做了这些。

【讨论】:

    猜你喜欢
    • 2013-03-16
    • 1970-01-01
    • 1970-01-01
    • 2019-04-01
    • 1970-01-01
    • 2017-09-22
    • 2014-09-26
    • 1970-01-01
    相关资源
    最近更新 更多