Fragment的onCreateView()方法中的NullPointerException

时间:2013-03-04 12:55:19

标签: android android-fragments view nullpointerexception

我的代码:

@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.");...

这是一个片段的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。

2 个答案:

答案 0 :(得分:4)

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


FragmentManager设置执行state transitionFragment的活动价值:

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

此外,在分离Fragment

后,它将此值设置为null
f.mCalled = false;
f.onDetach();

. . .

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

所以,如果其他一切都没问题,则onAttach()onDetach()之间的值不应该为空。


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

答案 1 :(得分: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()为我们这样做。