我的代码:
@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。
答案 0 :(得分:4)
以下是片段生命周期的内部结构:
FragmentManager
设置执行state transition的Fragment
的活动价值:
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()
;
答案 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()为我们这样做。