#android #android-intent #android-listview #nullpointerexception
#Android #android-намерение #android-listview #исключение nullpointerexception
Вопрос:
Я использую ListView
в Android, создав этот класс
public class HBSListView extends ListActivity;
Когда я нажимаю на элемент в списке и хочу перейти к следующему ListActivity
, показывая относительную информацию о выбранном элементе в предыдущем списке.
lv.setOnItemClickListener( new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
@SuppressWarnings("unchecked")
HashMap<String, String> o = (HashMap<String, String>) lv.getItemAtPosition(position);
Intent a = new Intent(iTeam.Ufinder.Application.HBS.HBSDetailView.class.getName());
a.putExtra("store_id", o.get("id"));
startActivity(a);
// When I use above code it is not working. I want to pass ID also.
// This works but i do not know how to pass ID this way.
// startActivity(new Intent("iTeam.Ufinder.Application.HBSDETAILVIEW"));
}
});
public class HBSDetailView extends ListActivity
это класс, в который я хочу перейти.
Файл Mainfest
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="iTeam.Ufinder.Application"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="10" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".Startup"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".main"
android:label="@string/app_name">
<intent-filter>
<action android:name="iTeam.Ufinder.Application.CLEARSCREEN" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity android:name="iTeam.Ufinder.Application.MANAGEMENT.Management"
android:label="@string/app_name">
<intent-filter>
<action android:name="iTeam.Ufinder.Application.MANAGEMENT" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity android:name="iTeam.Ufinder.Application.HBS.HBSListView"
android:label="@string/app_name">
<intent-filter>
<action android:name="iTeam.Ufinder.Application.HBSLISTVIEW" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity android:name="iTeam.Ufinder.Application.HBS.HBSDetailView"
android:label="@string/app_name">
<intent-filter>
<action android:name="iTeam.Ufinder.Application.HBSDETAILVIEW" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.INTERNET" />
Это Exception
:
04-15 13:04:43.901: ОШИБКА / AndroidRuntime (1417): исключение java.lang.RuntimeException: не удается создать экземпляр activity ComponentInfo{iTeam.Ufinder.Приложение / iTeam.Ufinder.Application.HBS.HBSDetailView}: java.lang.Исключение NullPointerException
Комментарии:
1. когда я запускаю свой проект, написав этот код, он генерирует ошибку и принудительно закрывает приложение. Намерение a = новое намерение (iTeam. Ufinder. Application.HBS.HBSDetailView.class.getName()); a.putExtra(«store_id», o.get(«id»)); startActivity(a); но когда я использую этот способ для перехода к новому ListActivity, это работает, но в этом случае я не могу получить идентификатор выбранного элемента списка на последнем экране! мне нужны некоторые методы для перехода к следующему действию списка с идентификатором выбранного элемента списка в текущем действии списка.
2. Посмотрите в logcat, должно быть исключение с stacktrace, если вы получаете принудительное закрытие.
3. Хорошо, я получил это исключение, не позволяющее создать экземпляр activity. и это исключение нулевой точки.
Ответ №1:
Когда вы создаете намерение, подобное этому
Intent a = new Intent(iTeam.Ufinder.Application.HBS.HBSDetailView.class.getName());
вы создаете его с именем действия вашего класса. Вам нужно создать намерение, подобное этому:
Intent a = new Intent(HBSListView.this, iTeam.Ufinder.Application.HBS.HBSDetailView.class);
Разница заключается в подписи вызова. Первое имеет один аргумент типа String
. Это означает создание Intent
с указанным действием. Второе касается аргументов Context
и Class
. Это для создания Intent
вызова указанного класса в указанном контексте.
Также проверьте, что o
не равно null.
Редактировать
Что ж, если вы хотите начать действие таким образом…
Intent a = new Intent("iTeam.Ufinder.Application.HBSDETAILVIEW");
a.putExtra("store_id", o.get("id"));
startActivity(a);
Приведенный выше код должен работать так, как вы ожидаете….
Комментарии:
1. Намерение конструктора (новый AdapterView. OnItemClickListener(){}, класс<HBSDetailView>) не определен.
2. О, я ошибаюсь… не
this
при первом аргументе. ИспользуйтеNameOfYourCurrectActivity.this
3. Я новичок в разработке Android, и у меня нет сильных знаний о Intent (); Это генерирует ошибку java, если я использую способ, который вы предлагаете.
4. Тем не менее, это создает исключение во время выполнения, которое не может создать экземпляр activity. Намерение intent = новое намерение (HBSListView.this, iTeam. Ufinder. Application.HBS.HBSDetailView.class ); startActivity (намерение); На данный момент я просто хочу запустить свое новое действие list, которое, если я сделаю это таким образом, я смогу запустить startActivity (новое намерение («iTeam. Ufinder. Приложение. HBSDETAILVIEW»)); Но таким образом я могу передать идентификатор выбранного элемента списка.
5. Нет, это не работает, то же исключение. Это проблема расширения активности / ListActivity? Потому что я расширяю ListActivity. общедоступный класс HBSDetailView расширяет ListActivity { } Это должно сработать: ( Мне нужно больше знаний!
Ответ №2:
Bundle bundle = new Bundle();
ListAdapter adapter = (new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,list1));
list.setAdapter(adapter);
list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View v,int position, long id) {
HashMap<String, String> o = (HashMap<String, String>) lv.getItemAtPosition(position);
if (position == 0) {
bundle.putString("store_id", o.get("id"));
Intent inten = new Intent("Activity name which is you must define in manifest file");
inten.putExtras(bundle);
startActivity(inten);
}
if(position==1) {
//write your code for when second item of listview clicked
}
.....
}
});
Добавьте свой Activity
в файл манифеста:
<activity
android:name=".className"
android:label="@string/app_name" >
<intent-filter>
<action android:name="com.test.ACTIVITY" />
//use this name when you want to run this activty
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
Комментарии:
1. Я думаю, это то, что вы хотите добавить в свой класс listview