我正在学习使用gridview的好教程。我一直无法使代码工作,但是随着我编译和运行app force关闭。 Logcat表示其“无法实例化活动CompnentInfo”等一系列其他错误。我不习惯调试,所以我陷入了僵局。这是我的代码:
public class GridViewDemo extends Activity {
public String[] filenames = {
"File 1",
"File 2",
"Roflcopters"
};
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
GridView gridview = (GridView) findViewById(R.id.gridview);
gridview.setAdapter(new ButtonAdapter(this));
}
//Classes
public class ButtonAdapter extends BaseAdapter {
private Context mContext;
// Gets the context so it can be used later
public ButtonAdapter(Context c) {
mContext = c;
}
// Total number of things contained within the adapter
public int getCount() {
return filenames.length;
}
// Require for structure, not really used in my code.
public Object getItem(int position) {
return null;
}
// Require for structure, not really used in my code. Can
// be used to get the id of an item in the adapter for
// manual control.
public long getItemId(int position) {
return position;
}
@SuppressWarnings("null")
public View getView(int position,
View convertView, ViewGroup parent) {
Button btn = null;
btn.setOnClickListener(new MyOnClickListener(position));
if (convertView == null) {
// if it's not recycled, initialize some attributes
btn = new Button(mContext);
btn.setLayoutParams(new GridView.LayoutParams(100, 55));
btn.setPadding(8, 8, 8, 8);
}
else {
btn = (Button) convertView;
}
btn.setText(filenames[position]);
// filenames is an array of strings
btn.setTextColor(Color.WHITE);
btn.setBackgroundResource(R.drawable.icon);
btn.setId(position);
return btn;
}
}
class MyOnClickListener implements OnClickListener {
private final int position;
public MyOnClickListener(int position) {
this.position = position;
}
public void onClick(View v) {
// Preform a function based on the position
// someFunction(this.position)
Toast.makeText(getApplicationContext(), this.position, Toast.LENGTH_SHORT).show();
}
}
XML:
<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gridview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:columnWidth="90dp"
android:numColumns="auto_fit"
android:verticalSpacing="10dp"
android:horizontalSpacing="10dp"
android:stretchMode="columnWidth"
android:gravity="center"
/>
清单xml:
<?xml version="1.0" encoding="utf-8"?>
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".GridviewActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
为什么会崩溃的任何想法? 这是logcat输出:
答案 0 :(得分:2)
首先,我建议学习如何调试[例如,参见this article和this one]。它很快就会变得很方便......
第二,下次请从logcat添加一个日志,其中显示导致“强制关闭”的异常的详细信息。
关于您的问题,您尝试在空对象上调用方法:
Button btn = null;
btn.setOnClickListener(new MyOnClickListener(position));
导致空指针异常。只有在将对象分配到btn
之后的if-else
之后,才应添加侦听器。
还有一件事 - 你压制null
警告(@SuppressWarnings("null")
),以避免警告,而不是照顾它,这样你就得到了空指针异常。除非百分之百肯定,否则不要忽视警告。
修改强>
看看你的清单,这是一个小错字。它应该是
<activity android:name=".GridViewActivity"
而不是:
<activity android:name=".GridviewActivity"