Android и сделать `this` слушателем для одной из его кнопок - PullRequest
3 голосов
/ 27 августа 2011

У меня есть пользовательское представление MyView, накачанное из my_view.xml (с соответствующим классом Java MyView.java).

Я переопределяю MyView(Context context, AttributeSet attrs), чтобы подключить подпредставления к членам класса.

Теперь одно из этих подпредставлений - Button, и я хотел бы, чтобы мое мнение прослушало нажатие на его кнопку перед передачей этого события делегату. Однако, если я объявлю

this.myButton.setOnClickListener(this);

в конструкторе MyView(Context context, AttributeSet attrs) (где this - это экземпляр MyView) Я получаю NullPointerException.

Где в MyClass.java находится подходящее место для звонка this.myButton.setOnClickListener(this);?

%%

Edit. Какой-то код:

public MyView(Context ctx, AttributeSet attrs)
{
  super(context, attrs);
  this.myButton = (Button) this.findViewById(R.id.my_button);
  this.myButton.setOnClickListener(this); // Raises null pointer;'id' is correct.
}

Ответы [ 2 ]

2 голосов
/ 27 августа 2011

Вместо того, чтобы пытаться выполнить вызов setOnClickListener(this) в конструкторе, сделайте это после полной инициализации кнопки.Попробуйте переместить setOnClickListener(this) так, чтобы он вызывался (косвенно) из метода onResume родительского действия следующим образом:

public class MainMenuActivity extends Activity {
    @Override
    public void onResume() {
        super.onResume();
        new MyView(this, attrs).onResume();
    }
   ...
}

public class MyView {
    public void onResume() {
        myButton.setOnClickListener(this);
    }
  ...
}

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

class ButtonHandler implements OnClickListener {
    @InjectView(R.id.MainMenuButton)
    private Button button;

    public void onResumeEvent( @Observes OnResumeEvent onResume ) {
        button.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        doSomethingUseful();
    }
}
0 голосов
/ 27 августа 2011

Проблема в том, что я пропустил инфляцию в конструкторе:

LayoutInflater i = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
i.inflate(R.layout.my_view, this);

Это сбивает меня с толку, так как я думал, что конструктор MyView(Context ctx, AttributeSet attrs) будет вызываться при надувании представления, а ненаоборот.

...