Проблема идентификации сгенерированной кнопки gridview - PullRequest
0 голосов
/ 05 мая 2011

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

Вот код, который я использую

[ButtonAdapter]

 public Context mContext;  

 String[] filenames = { "one", "two", "lul" };


 // 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;  
 }  

 public View getView(int position, View convertView, ViewGroup parent) {  
  Button btn;  

  if (convertView == null) {  
   // if it's not recycled, initialise 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.button);  
  btn.setId(position);  

  btn.setOnClickListener(new MyOnClickListener(position));  


  return btn;  
 }

}

Вот onClickListener

class MyOnClickListener extends gridview implements OnClickListener {

    private final int position;

    public MyOnClickListener(int position) {
        this.position = position;
    }

    @Override
    public void onClick(View v) {
        function3(this.position);
    }

И, наконец, моя основная деятельность

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    setUpViews();

    }

public void function3(int buttonposition) {
    if (buttonposition == 1) {
        Toast.makeText(this, "test", Toast.LENGTH_SHORT);
    } else {
        Toast.makeText(this, "test", Toast.LENGTH_LONG);
    }   
}

private void setUpViews() {

    GridView gridview = (GridView) findViewById(R.id.gridView2);  
    gridview.setAdapter(new ButtonAdapter(this));  
    }

}

Что приводит к следующей ошибке

05-05 00:41:12.949: ERROR/AndroidRuntime(1570): java.lang.NullPointerException
05-05 00:41:12.949: ERROR/AndroidRuntime(1570):     at android.content.ContextWrapper.getResources(ContextWrapper.java:80)
05-05 00:41:12.949: ERROR/AndroidRuntime(1570):     at android.widget.Toast.<init>(Toast.java:89)
05-05 00:41:12.949: ERROR/AndroidRuntime(1570):     at android.widget.Toast.makeText(Toast.java:231)
05-05 00:41:12.949: ERROR/AndroidRuntime(1570):     at com.gridview.msg.function3(msg.java:113)
05-05 00:41:12.949: ERROR/AndroidRuntime(1570):     at com.gridview.msg.MyOnClickListener.onClick(MyOnClickListener.java:21)

Это было моей головой на протяжении веков. Я уверен, что это что-то не так с утверждением if (buttonposition == 1)..., и я просто не правильно его называю или что-то в этом роде. Кто-нибудь знает, что не так?

Ответы [ 2 ]

0 голосов
/ 11 августа 2013

Установить свойство кнопок можно на фокусе и кликабельно на false.Потому что событие фокуса и щелчка фиксируется кнопкой в ​​текущем случае, а не на элементе вида сетки.ссылка ..... https://stackoverflow.com/a/11752450/2476688

0 голосов
/ 13 июня 2011

Вы пропускаете .show() в конце ваших makeText() вызовов.Toast.makeText() создает объект Toast, но вам все равно нужно вызвать show(), чтобы отобразить его:

Toast.makeText(this, "test", Toast.LENGTH_SHORT).show();
...