android: обрабатывать события компонентов AlertDialog в родительской активности
В моем приложении у меня есть сцена, где мне нужно показать listView с заголовком во многих ситуациях.
Поэтому я создал файл gen_list_layout.xml с TextView & ListView.
Теперь, чтобы показать список, я планировал создать метод "public static AlertDialog createAlertDialog(String title, String[] items, Activity Activity)", где я мог бы создать AlertDialog для того же самого.
public AlertDialog createAlertDialog(Activity act, String title, String[] items) {
LayoutInflater layoutInflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = layoutInflater.inflate(R.layout.gen_list_layout,null);
TextView titleTv = (TextView) view.findViewById(R.id.genListTitTv);
titleTv.setText(title);
ArrayAdapter<String> ad = new ArrayAdapter<String>(this, R.layout.list_item, R.id.genList, items);
ListView listView = (ListView) findViewById(R.id.genList);
listView.setAdapter(ad);
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
// I WANT THIS TO BE HNDLED IN THE ACTIVITY CALLING
listView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> arg0, View v, int position, long id) {
}
});
AlertDialog.Builder scrnDlg = new AlertDialog.Builder(act);
scrnDlg.setView(view);
final AlertDialog adg = scrnDlg.create();
return adg;
}
Я буду вызывать createAlertDialog() из разных Activity везде, где мне нужен список.
AlertDialog ad = Components.createAlertDialog(RouteListActivity.this, title, items);
Теперь, как мне обработать события щелчка для ListView, который находится в AlertDialog??
Любая подсказка, как это реализовать.
ОБНОВЛЕНИЕ Я обновляю свой Q после реализации вашего подхода и вижу исключение. Не могу получить причину исключения. Я создал класс и добавил createAlertDialog:
public class ListAlertDialog {
public AlertDialog createAlertDialog(Activity act, String title, String[] items, OnItemClickListener clickListener) {
Log.i("ListAD", "Start to create Alert Dialog");
LayoutInflater layoutInflater = (LayoutInflater)act.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = layoutInflater.inflate(R.layout.gen_list_layout, null);
Log.i("ListAD", "Got View :" + view.getId());
TextView titleTv = (TextView) view.findViewById(R.id.genListTitTv);
titleTv.setText(title);
Log.i("ListAD", "Set Title TV : " + titleTv.getId());
ArrayAdapter<String> ad = new ArrayAdapter<String>(act, R.layout.list_item, R.id.genList, items);
Log.i("ListAD", "Created Adapter");
ListView listView = (ListView) view.findViewById(R.id.genList);
listView.setAdapter(ad);
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
Log.i("ListAD", "Got ListView :" + listView.getId() + " & Set Adapter");
listView.setOnItemClickListener(clickListener);
Log.i("ListAD", "Added Listerner to listView : " + clickListener.getClass());
AlertDialog.Builder scrnDlg = new AlertDialog.Builder(act);
scrnDlg.setView(view);
Log.i("ListAD", "Set View of scrnDlg");
final AlertDialog adg = scrnDlg.create();
Log.i("ListAD", "Created Alert Dialog & returning it : " + adg );
return adg;
}
}
Мой файл gen_list.layout.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="wrap_content"
android:orientation="vertical">
<TextView android:id="@+id/genListTitTv" style="@style/inPageTitleStyle"
android:text="" />
<ListView android:id="@+id/genList" android:layout_width="match_parent" android:layout_height="wrap_content"
android:dividerHeight="0dp" android:divider="@null" />
</LinearLayout>
В своей деятельности я называю как:
ListAlertDialog lad = new ListAlertDialog();
AlertDialog ad = lad.createAlertDialog(Mumbai77Activity.this, "Select", items, clickListener);
Log.i(TAG, "Got the AD in Activity : " + ad + " ABT to Show");
ad.show();
Log.i(TAG, "Shown ad");
Ошибка, которую я получаю в журналах, является NullPointerException:
08-30 12:52:00.247: I/ListAD(366): Start to create Alert Dialog
08-30 12:52:00.257: I/ListAD(366): Got View :-1
08-30 12:52:00.257: I/ListAD(366): Set Title TV : 2131230764
08-30 12:52:00.257: I/ListAD(366): Created Adapter
08-30 12:52:00.257: I/ListAD(366): Got ListView :2131230765 & Set Adapter
08-30 12:52:00.267: I/ListAD(366): Added Listerner to listView : class org.mumbai77.core.Mumbai77Activity$2
08-30 12:52:00.267: I/ListAD(366): Set View of scrnDlg
08-30 12:52:00.267: I/ListAD(366): Created Alert Dialog & returning it : android.app.AlertDialog@44f29668
08-30 12:52:00.267: I/Mumbai77(366): Got the AD in Activity : android.app.AlertDialog@44f29668 ABT to Show
08-30 12:52:00.297: I/Mumbai77(366): Shown ad
08-30 12:52:00.417: D/AndroidRuntime(366): Shutting down VM
08-30 12:52:00.417: W/dalvikvm(366): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
08-30 12:52:00.437: E/AndroidRuntime(366): FATAL EXCEPTION: main
08-30 12:52:00.437: E/AndroidRuntime(366): java.lang.NullPointerException
08-30 12:52:00.437: E/AndroidRuntime(366): at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:353)
08-30 12:52:00.437: E/AndroidRuntime(366): at android.widget.ArrayAdapter.getView(ArrayAdapter.java:323)
08-30 12:52:00.437: E/AndroidRuntime(366): at android.widget.AbsListView.obtainView(AbsListView.java:1315)
08-30 12:52:00.437: E/AndroidRuntime(366): at android.widget.ListView.measureHeightOfChildren(ListView.java:1198)
08-30 12:52:00.437: E/AndroidRuntime(366): at android.widget.ListView.onMeasure(ListView.java:1109)
08-30 12:52:00.437: E/AndroidRuntime(366): at android.view.View.measure(View.java:8171)
08-30 12:52:00.437: E/AndroidRuntime(366): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
08-30 12:52:00.437: E/AndroidRuntime(366): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1012)
08-30 12:52:00.437: E/AndroidRuntime(366): at android.widget.LinearLayout.measureVertical(LinearLayout.java:381)
08-30 12:52:00.437: E/AndroidRuntime(366): at android.widget.LinearLayout.onMeasure(LinearLayout.java:304)
08-30 12:52:00.437: E/AndroidRuntime(366): at android.view.View.measure(View.java:8171)
08-30 12:52:00.437: E/AndroidRuntime(366): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
08-30 12:52:00.437: E/AndroidRuntime(366): at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
08-30 12:52:00.437: E/AndroidRuntime(366): at android.view.View.measure(View.java:8171)
08-30 12:52:00.437: E/AndroidRuntime(366): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
................
Посмотрев на исключение, я не могу получить реальную проблему, но при просмотре журналов, которые я добавил, я вижу, что Got View: -1 Я верю View view = layoutInflater.inflate(R.layout.gen_list_layout, null);
есть некоторые проблемы. Он не может получить представление или что-то подобное.
Любая идея, что может быть проблема с View - почему он не получает представление макета? Какие-либо изменения в b сделаны в макете или в inflate()?
Любая помощь высоко ценится..
Спасибо
1 ответ
Вы могли бы передать OnItemClickListener
в качестве параметра для вашего createAlertDialog
метод.
Метод создателя:
public AlertDialog createAlertDialog(Activity act, String title, String[] items, OnItemClickListener clickListener) {
LayoutInflater layoutInflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = layoutInflater.inflate(R.layout.gen_list_layout,null);
TextView titleTv = (TextView) view.findViewById(R.id.genListTitTv);
titleTv.setText(title);
ArrayAdapter<String> ad = new ArrayAdapter<String>(this, R.layout.list_item, R.id.genList, items);
ListView listView = (ListView) findViewById(R.id.genList);
listView.setAdapter(ad);
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
// I WANT THIS TO BE HNDLED IN THE ACTIVITY CALLING
listView.setOnItemClickListener(clickListener);
AlertDialog.Builder scrnDlg = new AlertDialog.Builder(act);
scrnDlg.setView(view);
final AlertDialog adg = scrnDlg.create();
return adg;
}
Ваша деятельность:
OnItemClickListener clickListener = new OnItemClickListener() {
public void onItemClick(AdapterView<?> arg0, View v, int position, long id) {
// Do some stuff in your activity's scope here.
}
}
AlertDialog ad = Components.createAlertDialog(RouteListActivity.this, title, items, clickListener);