У меня есть макет, который содержит несколько представлений. Я хочу установить некоторые действия, когда пользователь щелкает в любом месте макета, поэтому я установил OnClickListener для макета, который работает четко. Но как я могу узнать, какое представление было нажато? Я хочу назначить разные действия в зависимости от вида, который был нажат; или, может быть, не было нажато ни одного вида, и это был только сам макет. Таким образом, проблема заключается в том, что если я установлю OnClickListener для одного из представлений, будут активированы как OnCLickListener, связанные с макетом, так и представлением, но мне нужно только действие представления. Заранее спасибо.
Как можно узнать, какое представление щелкнуло в макете OnClickListener?
Ответы (7)
Другие ответы довольно абстрактны, а некоторые неверны. Вы не можете переопределить метод onClick для Activity, поскольку у него его нет (если, конечно, вы не реализуете OnClickListener).
Кроме того, если вы установите прослушиватель для макета, аргумент View
, полученный методом onClick, всегда будет макетом.
Вы можете либо создать свой собственный макет, который перехватывает клики и проверять, нажали ли вы на представление, либо вы можете установить прослушиватели для всех представлений.
Несколько более чистое решение использует один прослушиватель и проверяет, было ли выбрано представление.
private final String TAG = "MainActivity";
List<View> views = new ArrayList<View>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RelativeLayout rLayout = (RelativeLayout) findViewById(R.id.relativeLayout);
TextView tv1 = (TextView) findViewById(R.id.tv1);
TextView tv2 = (TextView) findViewById(R.id.tv2);
TextView tv3 = (TextView) findViewById(R.id.tv3);
views.add(tv1);
views.add(tv2);
views.add(tv3);
View.OnClickListener clickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
boolean isView = false;
for (View view : views) {
if (v.equals(view)) {
isView = true;
break;
}
}
if (isView) {
Log.e(TAG, "Click on view");
} else {
Log.e(TAG, "Click on layout");
}
}
};
tv1.setOnClickListener(clickListener);
tv2.setOnClickListener(clickListener);
tv3.setOnClickListener(clickListener);
rLayout.setOnClickListener(clickListener);
}
Если вам нужны разные действия для разных представлений, просто создайте прослушиватель для каждого из них.
Например, Layout имеет два представления View1 и View2. Я предполагаю, что вы их уже надули. Поэтому вам нужно установить OnClickListiner для каждого из них.
Layout.setOnClickListener(this);
View1.setOnClickListener(this);
View2.setOnClickListener(this);
Затем вам нужно переопределить метод:
public void onClick(View v)
{
switch(v.getId())
{
case R.id.id_for_layout:
// do what you want when user click layout
break;
case R.id.id_for_first_view:
// do what you want when user click first view
break;
case R.id.id_for_second_view:
// do what you want when user click second view
break;
}
}
Помните, что метод OnClick имеет один параметр, указывающий, какое представление выбрано!
public void onClick(View v) {
switch(v.getId()) {
case R.id.btn1:
// first button
break;
case R.id.btn2:
// second button
break;
}
}
Назначьте идентификатор каждому из ваших представлений с помощью android:id="@+id/v1", затем в
onClick(View v)
проверить вид, как
if(v == findViewById(R.id.v1))
{
// v1 specific action
}
else if(v == findViewById(R.id.v2))
{
// v2 specific action
}
if(v == findViewById(R.id.v1))
, а в switch(v.getItemId())
можно выполнять эту работу.
- person Pragnesh Ghoda シ; 06.08.2014
Хорошо, это легко.
Вы должны добавить OnClickListener к каждому представлению (кнопке, textView и т. д.), а также ко всему макету.
В этом случае onClickListeners, которые будут запущены при нажатии, являются onClickListener представления и макет onClickListener.
Так что нет необходимости в целой куче классов.
Одного будет достаточно, если вы попробуете это (выполняйте действия в зависимости от идентификатора и не забывайте о макете ;)):
public void onClick(View v) {
switch(v.getId()) {
case R.id.layout:
layout actions here
break;
case R.id.textview:
textview actions here
break;
это onClickListener для всех ваших представлений;)
для всех, кто заинтересован, вы также можете зарегистрировать текущий просмотр:
getActivity()
.getWindow()
.getDecorView()
.findViewById(android.R.id.content)
.setOnTouchListener((v, event) -> {
if (event.getAction() == MotionEvent.ACTION_UP) {
Log.v("[onClick]", v.getClass().getCanonicalName());
}
return false;
});
OnClickListener
к каждому представлению? - person Sergi Juanola   schedule 06.08.2014