web-dev-qa-db-ja.com

OnClickListenerからインテントを開始する方法

メインアクティビティは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)
15
twittfort

OnItemClickListenerはActivityを拡張しないでください。代わりに、OnItemClickListenerがListActivityインスタンスにアクセスできるようにする必要があります。既にアクティビティの一部であるビュー(ListViewなど)は、getContext()を介してListActivityインスタンスにアクセスできます。次に、onClickを次のように実装します。

@Override
public void onClick(View v) {
    Intent intent = new Intent(context, ShowDefinition.class);
    context.startActivity(intent);
}
22
Ted Hopp

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

3
MikeWallaceDev

あなたの概念は間違っています。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

   }
}
0
vieux