Добавление слушателя onClick, не зная представления макета и идентификаторы (Android) - PullRequest
0 голосов
/ 18 февраля 2012

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

public class SudokuActivity extends Activity implements OnClickListener{

 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.main);
     setAllOnClick();
 }

 private void setAllOnClick(){

    LayoutInflater li = getLayoutInflater();

    LinearLayout ll = (LinearLayout) li.inflate(R.layout.main, null);

    ArrayList<View> touchables = ll.getTouchables();

    for (View v : touchables){
        if (v instanceof Button){
            Toast.makeText(getApplicationContext(), ((Button) v).getText() , Toast.LENGTH_SHORT).show();
            v.setOnClickListener(this);
        }
    }
  }

 @Override
 public void onClick(View v) {
    Toast.makeText(getApplicationContext(), ((Button) v).getText() ,  Toast.LENGTH_SHORT).show();
 }
}

Тост в for отлично работает - это значит, что мне удаётся получить все экземпляры моих кнопок, но тост в методе onClick не работает, на самом деле я видел в отладчике, что он никогда не достигает метода onClick, но я не могу понять, почему?
Спасибо, и извините, если это слишком много, или я не заметил чего-то очень глупого!

Ответы [ 4 ]

4 голосов
/ 18 февраля 2012

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

Вот это работает:

@Override
public void onContentChanged() {
    super.onContentChanged();

    FrameLayout ll = (FrameLayout) findViewById(android.R.id.content);
    ArrayList<View> touchables = ll.getTouchables();

    for (View v : touchables){
        if (v instanceof Button){
            Toast.makeText(getApplicationContext(), ((Button) v).getText() , Toast.LENGTH_SHORT).show();
            v.setOnClickListener(this);
        }
    }

}

onContentChanged ()

Этот хук вызывается всякий раз, когда меняется вид содержимого экрана (из-за вызова Window.setContentView или Window.addContentView).

1 голос
/ 18 февраля 2012

waaaaait ... вы надуваете новый экземпляр представления контента и настраиваете слушателя на ТЕ, а не на экран.Ваша проблема с этими строками:

LayoutInflater li = getLayoutInflater();
LinearLayout ll = (LinearLayout) li.inflate(R.layout.main, null);

По сути, вы делаете копию материала на экране, поэтому он не работает.

То, что вы хотите сделать, это пойти вXML, установите идентификатор для линейного макета, который вы пытаетесь получить, и затем используйте findViewById , чтобы получить ссылку на него вместо этих двух строк.Вам нужно по-настоящему познакомиться с findViewById, вы будете часто его использовать:)

0 голосов
/ 18 февраля 2012

Как насчет того, чтобы прикрепить точку останова к v.setOnClickListener (this);и перешагните и осмотрите представление, чтобы увидеть, что является текущим зарегистрированным слушателем событий?

Я не уверен, действительно ли это весь ваш класс или извлеченный фрагмент:(этот);это действительно ваша деятельность.Используйте SudokuActivity.this, чтобы быть уверенным.

Кроме того, убедитесь, что ваша кнопка кликабельна: http://developer.android.com/reference/android/view/View.html#attr_android:clickable

Возможно, вы случайно скопировали макет из другого файла макета в вашем проекте?

0 голосов
/ 18 февраля 2012

Используйте кейс в вашем onClick()

switch (v.getId()){
    case R.id.buttonId:
        // do the toast here
    break;
}
...