メインアクティビティはListActivityを拡張し、リストを表示します。 DefinitionAdapterという名前のクラスで定義されたカスタムListitemを使用しています。 OnClickListenerを実装する別のクラスもあります。
クラスDefinitionAdapterで、OnClickListenerをListItemsに設定します。
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater)getContext().getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.row, null);
}
...
v.setOnClickListener(new OnItemClickListener(position) );
return v;
}
私のカスタムOnClickListenerは別のアクティビティを開始することになっています。
public class OnItemClickListener implements OnClickListener extends Activity {
private int position;
public OnItemClickListener(int p) {
position = p;
}
@Override
public void onClick(View v) {
Intent intent = new Intent(this, ShowDefinition.class);
startActivity(intent);
}
}
私がその権利を果たしているかどうかはわかりません。新しいアクティビティとマニフェストにリスナーを拡張したアクティビティを追加しました。
<activity Android:name="ShowDefinition" Android:label="@string/app_name">
</activity>
<activity Android:name="OnItemClickListener" Android:label="@string/app_name">
</activity>
それでも、リスト内のアイテムをクリックすると、アプリケーションは常にNullPointerExceptionで中断します。私は意図を間違って使用していると思います...何かアイデアはありますか?
Nikita Beloglazovのコメントに関して:
インテントを作成すると壊れます:
Intent intent = new Intent(this, ShowDefinition.class);
ここにスタックトレースがあります:
05-23 22:56:46.629: ERROR/AndroidRuntime(258): Uncaught handler: thread main exiting due to uncaught exception
05-23 22:56:46.659: ERROR/AndroidRuntime(258): Java.lang.NullPointerException
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at Android.content.ContextWrapper.getPackageName(ContextWrapper.Java:120)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at Android.content.ComponentName.<init>(ComponentName.Java:75)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at Android.content.Intent.<init>(Intent.Java:2551)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at com.andiandy.juradefinitions.OnItemClickListener.onClick(OnItemClickListener.Java:22)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at Android.view.View.performClick(View.Java:2364)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at Android.view.View.onTouchEvent(View.Java:4179)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at Android.view.View.dispatchTouchEvent(View.Java:3709)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at Android.view.ViewGroup.dispatchTouchEvent(ViewGroup.Java:852)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at Android.view.ViewGroup.dispatchTouchEvent(ViewGroup.Java:884)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at Android.view.ViewGroup.dispatchTouchEvent(ViewGroup.Java:884)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at Android.view.ViewGroup.dispatchTouchEvent(ViewGroup.Java:884)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at Android.view.ViewGroup.dispatchTouchEvent(ViewGroup.Java:884)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at Android.view.ViewGroup.dispatchTouchEvent(ViewGroup.Java:884)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at com.Android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.Java:1659)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at com.Android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.Java:1107)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at Android.app.Activity.dispatchTouchEvent(Activity.Java:2061)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at com.Android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.Java:1643)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at Android.view.ViewRoot.handleMessage(ViewRoot.Java:1691)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at Android.os.Handler.dispatchMessage(Handler.Java:99)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at Android.os.Looper.loop(Looper.Java:123)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at Android.app.ActivityThread.main(ActivityThread.Java:4363)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at Java.lang.reflect.Method.invokeNative(Native Method)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at Java.lang.reflect.Method.invoke(Method.Java:521)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:860)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:618)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at dalvik.system.NativeStart.main(Native Method)
OnItemClickListenerはActivityを拡張しないでください。代わりに、OnItemClickListenerがListActivityインスタンスにアクセスできるようにする必要があります。既にアクティビティの一部であるビュー(ListViewなど)は、getContext()
を介してListActivityインスタンスにアクセスできます。次に、onClick
を次のように実装します。
@Override
public void onClick(View v) {
Intent intent = new Intent(context, ShowDefinition.class);
context.startActivity(intent);
}
OnItemClickListenerを実装するには2つの方法があります。新しいクラスを作成する必要はありません。多分あなたは今のところそれを簡単な方法で試すことができます:)
ListActivityにAdapterView.OnItemClickListenerを実装させる
public class MyActivity extends ListActivity implements AdapterView.OnItemClickListener
次に、ListActivityのonCreateで、onClickListenerを次のように設定します。
ListView lstvwContacts = getListView();
lstvwContacts.setOnItemClickListener(this);
そして、あなたはこのようにクリックに反応することができます:
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
switch (parent.getId()) {
case Android.R.id.list: {
Log.v(TAG, "onItemClick");
Intent intent = new Intent(this, ShowDefinition.class);
startActivity(intent);
}
}
}
それはクリックのためにそれをするべきです。アイテムがいつ選択されたかを知る必要がある場合は、AdapterView.OnItemSelectedListenerを調べることができます。
-I_Artist
あなたの概念は間違っています。OnItemClickListenerはActivityを拡張してはならず、毎回新しいonClickListenerを作成するべきではありません。
public class MainActivity extends Activity {
OnItemClickListener = null;
MainActivity() {
//Build your OnItemClickListener with a valid context
OnItemClickListener = new OnItemClickListener(this);
}
public View getView(int position, View convertView, ViewGroup parent) {
...
//Here user the OnItemClickListener
}
}