Как запустить Intent из OnClickListener - PullRequest
15 голосов
/ 24 мая 2011

Моя основная активность расширяет ListActivity и отображает список.Я использую пользовательские элементы списка, определенные в классе с именем DefinitionAdapter.У меня также есть отдельный класс, который реализует 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.Я думаю, что я использую намерение неправильно ... какие-либо идеи?

В отношении комментария Никиты Белоглазова:

Он ломается, когда я создаю намерение:

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)

Ответы [ 3 ]

22 голосов
/ 24 мая 2011

Ваш OnItemClickListener не должен расширять Activity.Вместо этого вы должны организовать, чтобы OnItemClickListener имел доступ к вашему экземпляру ListActivity.Любое представление, которое уже является частью действия (например, ListView), имеет доступ к экземпляру ListActivity через getContext().Затем реализуйте onClick так:

@Override
public void onClick(View v) {
    Intent intent = new Intent(context, ShowDefinition.class);
    context.startActivity(intent);
}
3 голосов
/ 24 мая 2011

Существует два способа реализации onItemClickListener. Вам не нужно создавать новый класс. Может быть, вы можете попробовать это простым способом сейчас :)

Пусть ваш ListActivity реализует AdapterView.OnItemClickListener

public class MyActivity extends ListActivity implements AdapterView.OnItemClickListener

Затем в onCreate вашей ListActivity установите свой 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

0 голосов
/ 24 мая 2011

Ваша концепция неверна, ваш 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

   }
}
...