2011-05-23 18 views
15

Mi actividad principal amplía ListActivity y muestra una lista. Estoy usando Listitems personalizados definidos en una clase llamada DefinitionAdapter. También tengo una clase separada que implementa OnClickListener.Cómo puedo iniciar una Intención desde un OnClickListener

En el DefinitionAdapter clase I establezca la OnClickListener a los 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; 
    } 

Mi costumbre OnClickListener se supone que iniciar otra actividad.

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); 

    } 

} 

No estoy seguro de estar haciendo eso bien. Añadí mi nueva actividad para el manifiesto, así como la actividad extendí al oyente con:

<activity android:name="ShowDefinition" android:label="@string/app_name"> 
</activity> 
<activity android:name="OnItemClickListener" android:label="@string/app_name"> 
</activity>  

No obstante, si hago clic en un elemento de mi lista, la aplicación siempre se rompe con una NullPointerException. Creo que estoy usando el intento equivocado ... ¿alguna idea?

En lo que respecta al comentario de Nikita Beloglazov:

Se rompe cuando se crea la Intención:

Intent intent = new Intent(this, ShowDefinition.class); 

Aquí está la StackTrace:

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) 
+0

A qué línea si se rompe exactamente? ¿Podrías publicar stacktrace? –

+0

Agregué esa información – twittfort

Respuesta

21

Su OnItemClickListener no debe extenderse actividad. En su lugar, debe organizar que OnItemClickListener tenga acceso a su instancia de ListActivity. Cualquier vista que ya es parte de la actividad (como ListView) tiene acceso a la instancia ListActivity a través del getContext(). A continuación, poner en práctica onClick así:

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

Eso realmente hace el truco. Ya lo intenté: 'Intent intent = new Intent (v.getContext(), ShowDefinition.clase); ' Pero luego comienzo la intención con startActivit (intento). Ahora uso 'v.getContext(). StartActivity (intent)' que hace el truco. ¡Gracias! – twittfort

+0

Me alegro de que funcionó. Un enfoque mucho mejor, en realidad, es anular 'onListItemClicked' en su subclase ListActivity. Entonces no necesita ningún oyente clic. (P.S. Si todavía no lo ha hecho, no olvide eliminar OnItemClickListener de la lista de actividades en el manifiesto.) –

+0

Simplemente lo hice siguiendo las instrucciones de I_Artist. Esto es realmente mucho mejor. Supongo que simplemente no encontré las instrucciones de ListActivity correctas. Debería haber leído la documentación con más cuidado. Gracias por la ayuda. – twittfort

0

Su concepción es errónea, su OnItemClickListener no debe extiende actividad y no se debe construir una nueva OnClickListener cada vez.

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

Disculpa, no obtuve esa solución:/Pero ya lo solucioné :) – twittfort

3

Existen dos formas de implementar un onItemClickListener. No es necesario crear una nueva clase. Tal vez se puede tratar de la manera fácil por ahora :)

Que su ListActivity aplicar AdapterView.OnItemClickListener

public class MyActivity extends ListActivity implements AdapterView.OnItemClickListener 

Luego, en onCreate de su ListActivity fija su OnClickListener así:

 ListView lstvwContacts = getListView(); 
     lstvwContacts.setOnItemClickListener(this); 

Y luego Puede reaccionar al clic de esta manera:

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); 
     }  
    } 
} 

Eso s debería hacerlo por los clics. Si lo que necesita saber cuando se selecciona un elemento se puede mirar en AdapterView.OnItemSelectedListener

-I_Artist

+0

Gracias. Apreciaré esa solución. Trataré de implementarlo de esa manera en el futuro. Hice la clase extra para comprender mejor el concepto. – twittfort

+0

Bien, ahora probé tu solución. ¡Realmente es mucho más simple! Acabo de tener problemas para implementar AdapterView.OnItemClickListener. Eclipse no lo encontró. Tuve que implementar android.widget.AdapterView.OnItemClickListener – twittfort

+0

De nada. Acabo de editar mi respuesta para agregar el código real para la intención. ¡Espero que todo salga como quieras! Siéntase libre de votar mi respuesta si cree que ayudó :) – MikeWallaceDev

Cuestiones relacionadas