3

我的代码:

@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。

4

2 回答 2

4

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


FragmentManager设置Fragment执行状态转换的活动值:

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

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

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

. . .

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

因此,如果其他一切都很好,则该值不应为 null、介于onAttach()和之间。onDetach()


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

于 2013-03-04T13:00:26.247 回答
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-04T14:06:42.730 回答