开发者

Android: Gridview force closes

开发者 https://www.devze.com 2023-04-09 15:53 出处:网络
I am following a good tutorial on using a gridview. I have been unable to get the code to work however as ever time I compile and run the app force closes. Logcat says its \"unable to instantiate acti

I am following a good tutorial on using a gridview. I have been unable to get the code to work however as ever time I compile and run the app force closes. Logcat says its "unable to instantiate activity CompnentInfo" amount a series of other errors. I'm not to handy with debugging so I'm at an impasse. This is my code:

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 {
         pr开发者_开发知识库ivate 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"
/>

Manifest 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>

Any ideas why this crashes? This is the logcat output:

Android: Gridview force closes


First, I would recommend learning how to debug [see this article and this one for example]. It will become handy very soon...

Second, next time please add a log from logcat, which shows the details for the exception which caused the "force close".

Regarding your problem, you are trying to call a method on a null object:

Button btn = null;
btn.setOnClickListener(new MyOnClickListener(position)); 

which causes a null pointer exception. You should add the listener only after you assigned an object to btn, which is after the if-else blocks.

One more things - you suppressed the null warning (@SuppressWarnings("null")), to avoid the warning, instead of taking care of it, and this way you got the null pointer exception. Unless you are hundred percents sure, don't ignore the warnings.

Edit:

Looking at your manifest, this is a small typo. It should be

<activity android:name=".GridViewActivity"

Instead of:

<activity android:name=".GridviewActivity"
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号