java.lang.NoSuchMethodException: onClick в представлении списка на Android - PullRequest
1 голос
/ 17 июня 2011

в моем приложении я использую кнопку изображения в виде списка. Я пишу действие для каждой кнопки изображения. но я получаю исключение java.lang.NoSuchMethodException: onClick. Я не знаю причину ошибки, пожалуйста, помогите мне. Как написать действие для кнопок изображения. заранее спасибо.

public class InventoryListActivity extends ListActivity {
  private InventoryAdapter adapter;
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.inventory_list);
    adapter = new InventoryAdapter(this);
    setListAdapter(adapter);
 }
}

в операции InventoryAdapter:

public class InventoryAdapter extends BaseAdapter implements Observer,OnClickListener {


public InventoryAdapter(Context ctx) {     
    context = ctx;
    inventory = IAPManager.shared().getInventory();
    inventory.addObserver(this);
    inventory.load();
}

public void update(Observable o, Object arg) {

    switch ( ((Inventory)arg).getStatus() ) {
    case LOADED:
        this.notifyDataSetChanged();
        break;
    default:
        break;
    }
}

@Override
public int getCount() {
    return inventory.size(Inventory.FilterType.ALL);
}

@Override
public Object getItem(int position) {
    return inventory.getProducts(Inventory.FilterType.ALL).get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    Product product = (Product) getItem(position);

    View view;

    if(convertView == null) {
        LayoutInflater inflater = (LayoutInflater)
        context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(R.layout.inventory_list_item, null);
    }

    else {
        view = convertView;
    }

    play = (ImageButton)findViewById(R.id.imageButton2);
    detail = (ImageButton)findViewById(R.id.imageButton3);
    buy = (ImageButton)findViewById(R.id.imageButton2);

    play.setTag(position);
    detail.setTag(position);
    buy.setTag(position);

    titleView = (TextView) view.findViewById(R.id.product_title);
    titleView.setText(product.getTitle());


    iconView = (ImageView) view.findViewById(R.id.product_icon);

    String iconURL = product.getIconURLString();

    if(AsyncImageLoader.contains(iconURL)) {
        iconView.setImageDrawable(AsyncImageLoader.get(iconURL));
    }

    else {
        iconView.setImageDrawable(null);
        new AsyncImageLoader(product.getIconURLString(), new AsyncImageLoader.Delegate(){
            public void imageLoaded(String urlString, Drawable imageDrawable) {
                notifyDataSetChanged();
            }
        });
    }

    descriptionView = (TextView) view.findViewById(R.id.product_description);
    descriptionView.setText(product.getDescription());

    return view;
}

private ImageButton findViewById(int imagebutton2) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public void onClick(View v) {

    Log.e("onclick","onclick");
    Integer position = (Integer) v.getTag();
    switch(v.getId()){
    case R.id.imageButton1:
       Log.e("Buy","buy position"+position);

    break;
    case R.id.imageButton2:
        Log.e("play","play position"+position);
    break;
    case R.id.imageButton3:
        Log.e("detail","detail  position"+position);
    break;  
    }       
}

}

в xml:

            <ImageButton android:background="@drawable/play_btn"    android:focusable="false" android:onClick="onClick"
            android:layout_width="wrap_content" android:layout_height="wrap_content"
            android:id="@+id/imageButton2" android:layout_weight="0.5" />

Ответы [ 5 ]

3 голосов
/ 09 декабря 2012

Для тех из нас, кто упрям ​​и не хочет создавать OnClickListener, вот пример:

http://developer.android.com/reference/android/widget/Button.html

ПРИМЕЧАНИЕ: подключить XML-файлы для Android: в поле onClick до метода вашей деятельности вам потребуется правильная подпись, а именно:

void YourMethod(View v);
2 голосов
/ 17 июня 2011

Я думаю, проблема в том, что вы пытаетесь подключить прослушиватель onClick через xml, но внедряете его в свой адаптер.Я думаю, что Android просто не распознает прослушиватель onClick или не знает, что следует использовать для ImageButton.Попробуйте реализовать и добавить OnClickListener динамически в методе getView ().

ОБНОВЛЕНИЕ

Проверьте первый оператор if метода getView ().Там OnClickListener будет установлен для 3 кнопок.Поскольку ваш адаптер реализует интерфейс OnClickListener, вы передаете adpater методу.Вы также должны удалить атрибут android:onClick="onClick" из кнопок ImageButtons в XML-файле макета.

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        Product product = (Product) getItem(position);

        View view;

        if(convertView == null) {
            LayoutInflater inflater = (LayoutInflater)
            context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = inflater.inflate(R.layout.inventory_list_item, null);

            play = (ImageButton)findViewById(R.id.imageButton2);
            detail = (ImageButton)findViewById(R.id.imageButton3);
            buy = (ImageButton)findViewById(R.id.imageButton2);

            // Set the OnClickListener for the 3 image buttons. 
            play.setOnClickListener(this);
            detail.setOnClickListener(this);
            buy.setOnClickListener(this);

        }

        else {
            view = convertView;
        }

        play = (ImageButton)findViewById(R.id.imageButton2);
        detail = (ImageButton)findViewById(R.id.imageButton3);
        buy = (ImageButton)findViewById(R.id.imageButton2);

        play.setTag(position);
        detail.setTag(position);
        buy.setTag(position);

        titleView = (TextView) view.findViewById(R.id.product_title);
        titleView.setText(product.getTitle());


        iconView = (ImageView) view.findViewById(R.id.product_icon);

        String iconURL = product.getIconURLString();

        if(AsyncImageLoader.contains(iconURL)) {
            iconView.setImageDrawable(AsyncImageLoader.get(iconURL));
        }

        else {
            iconView.setImageDrawable(null);
            new AsyncImageLoader(product.getIconURLString(), new AsyncImageLoader.Delegate(){
                public void imageLoaded(String urlString, Drawable imageDrawable) {
                    notifyDataSetChanged();
                }
            });
        }

        descriptionView = (TextView) view.findViewById(R.id.product_description);
        descriptionView.setText(product.getDescription());

        return view;
   }
1 голос
/ 18 июня 2011

Вам нужно удалить android: onClick = "onClick" из вашего XML, потому что ImageButton не знает, что это значит.Вот почему вы получаете NoSuchMethodException во время выполнения.

Вы также должны удалить метод findViewById, который возвращает null - это не вызовет ничего, кроме проблем.

Не реализуйте OnClickListener, этоне то, что вы хотите для этого.А затем избавьтесь от вашего метода onClick.Вместо этого вы должны определить новый OnClickListener для каждого ImageButton.Примерно так:

play.setOnClickListener(new View.OnClickListener() {
    public void onClick(View arg0) {
        Log.i("play","play button clicked");
    }
});

Сделайте это для каждой кнопки Image, Play, Detail и Buy.Обратите внимание, что вы можете использовать любую переменную, которая определена как окончательная.

final Product product = (Product)getItem(position);

detail.setOnClickListener(new View.OnClickListener() {
    public void onClick(View arg0) {
        Log.i("detail", "clicked for product " + product.toString());
    }
}

Надеюсь, это укажет вам правильное направление.

0 голосов
/ 12 декабря 2013

Если ваш макет надувается в Fragment, в котором вы хотите перехватить onClick, как указано в XML, он может быть направлен на ваш основной Activity.

У меня есть ViewPager, который показывает несколько фрагментов. Каждый фрагмент имеет кликабельный ImageView, который должен вызывать changePicture при нажатии, но код фрагмента не вызывается, это главный Activity, который получает вызов.

Таким образом, я решил, что нужно определить onClickListener, как упоминали многие.

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

Я сделал похожую вещь, но в основном упражнении (где объявляется просмотр списка) я добавил это:

listView.setOnItemClickListener(new OnItemClickListener(){
        public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
              switch(view.getId()){
                  case R.id.imageButton1:
                      Log.e("Buy","buy position"+position);
                      break;
                  case R.id.imageButton2:
                      Log.e("play","play position"+position);
                      break;
                  case R.id.imageButton3:
                      Log.e("detail","detail  position"+position);
                      break;  
               }     
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...