Android: Gridview принудительно закрывается - PullRequest
0 голосов
/ 01 октября 2011

Я следую хорошему руководству по использованию gridview . Однако я не смог заставить работать код, как всегда, когда я компилирую и запускаю приложение, оно закрывается. 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: enter image description here

1 Ответ

2 голосов
/ 01 октября 2011

Во-первых, я бы порекомендовал научиться отлаживать [см. эту статью и эту например].Очень скоро это станет удобным ...

Во-вторых, в следующий раз, пожалуйста, добавьте журнал из logcat, в котором показаны подробности исключения, вызвавшего "принудительное закрытие".

Относительно вашей проблемы, вы пытаетесь вызвать метод для нулевого объекта:

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

, что вызывает исключение нулевого указателя.Вы должны добавлять прослушиватель только после того, как вы присвоили объект btn, то есть после блоков if-else.

Еще одна вещь - вы подавили предупреждение null (@SuppressWarnings("null")), чтобы избежатьпредупреждение вместо того, чтобы позаботиться об этом, и таким образом вы получили исключение нулевого указателя.Если вы не уверены на сто процентов, не игнорируйте предупреждения.

Редактировать:

Глядя на свой манифест, это небольшая опечатка.Это должно быть

<activity android:name=".GridViewActivity"

Вместо:

<activity android:name=".GridviewActivity"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...