Улавливание события при выпадении счетчика
Я хочу, чтобы поймать событие, когда выкручивание спиннера отклонено. Мы можем поймать его, когда пользователь нажимает на любой элемент в onItemSelected(). Но я хочу поймать, даже когда пользователь прикасается за пределы области раскрывающегося списка или назад, поскольку они тоже заставляют его исчезать. В этих двух случаях, когда я наблюдал журнал, он говорит "Попытка закончить входное событие, но приемник входных событий уже установлен"
Я наблюдал исходный код, это напечатано из InputEventReceiver.java в finishInputEvent ( Событие InputEvent, обработанное булевым способом). Но это окончательный метод, поэтому нет смысла его переопределять. Может кто-нибудь, пожалуйста, предложите способ обращения, когда выпадение будет отклонено в этих случаях?
Ответы
Ответ 1
Я использовал Popup Menu
вместо Spinner. Поскольку, насколько я знаю, событие отклонения не может быть захвачено spinner, но с помощью всплывающего меню я сделал это, установив onDismissListerner()
во всплывающее меню
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
Toast.makeText(MyActivity.this,"Clicked on: " + item.getTitle(),Toast.LENGTH_LONG).show();
return true;
}
});
popup.setOnDismissListener (new PopupMenu.OnDismissListener(){
public void onDismiss()
{
//catch dismiss event here.
}
});
Ответ 2
Как насчет поиска другого события, такого как onDetachFromWindow
? У Spinner нет каких-либо регулярных событий жизненного цикла, с которыми мы работаем много - было бы неплохо работать с onStop
или onDestroy
. Конечно, вам нужно будет расширить класс spinner и создать интерфейс для определения вашего собственного слушателя:
public class ChattySpinner extends Spinner {
private ChattySpinnerListener chattyListener;
public ChattySpinner(Context context) {
super(context);
}
public ChattySpinner(Context context, int mode) {
super(context, mode);
}
public ChattySpinner(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ChattySpinner(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public ChattySpinner(Context context, AttributeSet attrs, int defStyle, int mode) {
super(context, attrs, defStyle, mode);
}
public void setChattyListener(ChattySpinnerListener listener) {
this.chattyListener = listener;
}
@Override
protected void onDetachedFromWindow() {
if(chattyListener != null) {
chattyListener.onDetach();
}
super.onDetachedFromWindow();
}
public interface ChattySpinnerListener {
public void onDetach();
}
}
И в вашем XML-макете вы должны убедиться, что вы указали этот элемент управления вместо своего обычного счетчика, а в своем коде установите слушателя с реализацией того, что вы хотите сделать, когда отделитель спиннинга. Вам будет необходимо выяснить на стороне клиента, как отслеживать, было ли что-то выбрано или нет, возможно, установив переменную в методе onItemSelected
, которую вы предоставите слушателю выбора.
Ответ 3
Если вам действительно не нужно использовать spinner, попробуйте использовать этот код.
ListView внутри диалога. Вы можете прослушать событие Отменить/отклонить диалог (То же самое). Вы можете использовать это в API 11.
final Dialog dialog = new Dialog(context);
dialog.setContentView(R.layout.custom_list_popup);
//dialog.setCancelable(false);
dialog.setTitle("Title");
dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
//
//Do your onCancel things here
//
}
});
final ListView listView = (ListView) dialog.findViewById(R.id.lv_sales_tax);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//
//Do your stuff here
//
dialog.dismiss();
}
});
dialogButton.setVisibility(View.GONE);
dialog.show();
}
});
содержимое custom_list_popup.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="20dp"
android:orientation="vertical">
<ListView
android:id="@+id/lv_sales_tax"
android:divider="@drawable/list_divider"
android:dividerHeight="20dp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>