我目前正在尝试创建一个应用程序,该应用程序包含一个gridview作为主要布局,并使用Fragments填充gridview,可以将其展开以在单击时替换主视图。我的问题是我的自定义适配器为我的片段视图返回null并在启动应用程序时导致强制关闭...或者我相信。片段也都以编程方式声明了它们的布局...我添加了空白ID并使用setId(R.id.blahblah)设置它们...想知道是否可能与问题有关
11-06 17:18:58.119 28254-28254/com.osiris.basket E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.NullPointerException
at android.widget.AbsListView.obtainView(AbsListView.java:2179)
at android.widget.GridView.onMeasure(GridView.java:1040)
at android.view.View.measure(View.java:15855)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5012)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at android.view.View.measure(View.java:15855)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5012)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at android.view.View.measure(View.java:15855)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5012)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
at android.view.View.measure(View.java:15855)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5012)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2451)
at android.view.View.measure(View.java:15855)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1905)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1104)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1284)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1004)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5481)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
at android.view.Choreographer.doCallbacks(Choreographer.java:562)
at android.view.Choreographer.doFrame(Choreographer.java:532)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
at android.os.Handler.handleCallback(Handler.java:730)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5289)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555)
at dalvik.system.NativeStart.main(Native Method)
自定义适配器:
public class FragmentAdapter extends BaseAdapter {
private Context mContext;
public FragmentAdapter(Context c) {
mContext = c;
}
private Fragment[] mEggs = {
//new DessertCase(mContext),
//new Nyandroid(mContext),
new Logo(mContext)
};
@Override
public int getCount() {
return mEggs.length;
}
@Override
public Fragment getItem(int i) {
return mEggs[i];
}
@Override
public long getItemId(int i) {
Fragment frag = mEggs[i];
return frag.getId();
}
public View getView(int position, View convertView, ViewGroup parent) {
Fragment frag = mEggs[position];
View view;
if (convertView == null) { // if it's not recycled, initialize some attributes
view = frag.getView();
//view.setLayoutParams(new GridView.LayoutParams(85, 85));
//view.setPadding(8, 8, 8, 8);
} else {
view = convertView;
}
return view;
}
}
其中一个片段:
public class Logo extends Fragment {
Toast mToast;
ImageView mContent;
int mCount;
final Handler mHandler = new Handler();
public static int SDK_INT = android.os.Build.VERSION.SDK_INT;
public String n;
private Context context;
public Logo(Context context) {
this.context = context;
}
private View makeView() {
DisplayMetrics metrics = new DisplayMetrics();
getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);
LinearLayout view = new LinearLayout(context);
view.setOrientation(LinearLayout.VERTICAL);
view.setId(R.id.beanbag);
view.setLayoutParams(
new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT
));
final int p = (int) (8 * metrics.density);
view.setPadding(p, p, p, p);
Typeface light = Typeface.create("sans-serif-light", Typeface.NORMAL);
Typeface normal = Typeface.create("sans-serif", Typeface.BOLD);
final float size = 14 * metrics.density;
final LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
lp.gravity = Gravity.CENTER_HORIZONTAL;
lp.bottomMargin = (int) (-4 * metrics.density);
TextView tv = new TextView(context);
if (light != null) tv.setTypeface(light);
tv.setTextSize(1.25f * size);
tv.setTextColor(0xFFFFFFFF);
tv.setShadowLayer(4 * metrics.density, 0, 2 * metrics.density, 0x66000000);
tv.setText("Android " + Build.VERSION.RELEASE);
view.addView(tv, lp);
tv = new TextView(context);
if (normal != null) tv.setTypeface(normal);
tv.setTextSize(size);
tv.setTextColor(0xFFFFFFFF);
tv.setShadowLayer(4 * metrics.density, 0, 2 * metrics.density, 0x66000000);
if (SDK_INT == 9 || SDK_INT == 10) {
n = "Gingerbread";
} else if (SDK_INT == 11 || SDK_INT == 12 || SDK_INT == 13) {
n = "Honeycomb";
} else if (SDK_INT == 14 || SDK_INT == 15) {
n = "ICS";
} else if (SDK_INT >= 15) {
n = "JELLY BEAN";
}
tv.setText(n);
view.addView(tv, lp);
return view;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getActivity().requestWindowFeature(Window.FEATURE_NO_TITLE);
getActivity().getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
mToast = Toast.makeText(context, "", Toast.LENGTH_LONG);
mToast.setView(makeView());
DisplayMetrics metrics = new DisplayMetrics();
getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);
mContent = new ImageView(context);
mContent.setImageResource(R.drawable.platlogo_alt);
mContent.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
final int p = (int) (32 * metrics.density);
mContent.setPadding(p, p, p, p);
mContent.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mToast.show();
mContent.setImageResource(R.drawable.platlogo);
}
});
mContent.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
try {
startActivity(new Intent(Intent.ACTION_MAIN)
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_CLEAR_TASK
| Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS)
.addCategory("com.osiris.beanbag.BeanBag"));
//.setClassName("com.android.systemui","com.android.systemui.beanbag"));
} catch (ActivityNotFoundException ex) {
android.util.Log.e("PlatLogoActivity", "Couldn't find a bag of beans.");
}
getActivity().finish();
return true;
}
});
//mContent.setId(R.id.beanbag);
}
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.id.beanbag, container, false);
}
}
答案 0 :(得分:0)
您正在片段“frag.getView()”上调用getView方法。它返回获取片段布局的根视图(onCreateView(LayoutInflater,ViewGroup,Bundle)返回的视图),如果提供的话。 :在developer.android.com上找到。在onCreateView中,您正在膨胀“R.id.beanbag”。如果您查看一些示例,您可以在此处看到您想要扩展布局,例如“R.layout.xml_file_in_res_layout”