2016-04-10 4 views
0

Je suis développeur d'une application Android. Dans mon application, je crée un téléavertisseur d'image personnalisé en utilisant un adaptateur pager. Ce que je veux, c'est que je veux démarrer l'activité de l'image quand je clique sur l'image actuelle du pager. J'ai donc essayé de démarrer l'activité à l'intérieur de l'adaptateur. Mon téléavertisseur fonctionne correctement sauf l'activité de démarrage. Mais quand je commence l'activité, c'est jeter l'erreur. S'il vous plaît aidez-moi pourquoi? Comment puis-je le réparer?Pourquoi ne peut pas ouvrir l'activité dans l'adaptateur de pager personnalisé dans Android?

Ceci est mon adaptateur téléavertisseur et la façon dont je commence l'activité à l'intérieur

public class ItemImagePager extends PagerAdapter{ 
    Context mContext; 
    LayoutInflater mLayoutInflater; 

    ArrayList<String> mResources; 

    public ItemImagePager(Context context,ArrayList<String> urls) { 
     mContext = context; 
     mLayoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     mResources = urls; 
    } 

    @Override 
    public int getCount() { 
     return mResources.size(); 
    } 

    @Override 
    public boolean isViewFromObject(View view, Object object) { 
     return view == ((LinearLayout) object); 
    } 

    @Override 
    public Object instantiateItem(ViewGroup container, final int position) { 
     View itemView = mLayoutInflater.inflate(R.layout.item_image_pager_item, container, false); 

     ImageView imageView = (ImageView) itemView.findViewById(R.id.image_view_item_image_pager); 
     Picasso.with(mContext).load(mResources.get(position)).into(imageView); 
     imageView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent i = new Intent(mContext, ViewImageActivity.class); 
       i.putExtra("url",mResources.get(position)); 
       mContext.startActivity(i); 
      } 
     }); 

     container.addView(itemView); 

     return itemView; 
    } 

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     container.removeView((LinearLayout) object); 
    } 
} 

C'est le logcat quand je commence l'activité cliquant sur l'image

04-10 11:05:37.698 28934-28934/com.blog.waiyanhein.mmfashion.mmfashion W/EGL_genymotion: eglSurfaceAttrib not implemented 
04-10 11:05:37.742 28934-28934/com.blog.waiyanhein.mmfashion.mmfashion W/EGL_genymotion: eglSurfaceAttrib not implemented 
04-10 11:05:38.938 28934-28934/com.blog.waiyanhein.mmfashion.mmfashion D/AndroidRuntime: Shutting down VM 
04-10 11:05:38.938 28934-28934/com.blog.waiyanhein.mmfashion.mmfashion W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0xa6184908) 
04-10 11:05:38.938 28934-28934/com.blog.waiyanhein.mmfashion.mmfashion E/AndroidRuntime: FATAL EXCEPTION: main 
04-10 11:05:38.938 28934-28934/com.blog.waiyanhein.mmfashion.mmfashion E/AndroidRuntime: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want? 
04-10 11:05:38.938 28934-28934/com.blog.waiyanhein.mmfashion.mmfashion E/AndroidRuntime:  at android.app.ContextImpl.startActivity(ContextImpl.java:952) 
04-10 11:05:38.938 28934-28934/com.blog.waiyanhein.mmfashion.mmfashion E/AndroidRuntime:  at android.app.ContextImpl.startActivity(ContextImpl.java:939) 
04-10 11:05:38.938 28934-28934/com.blog.waiyanhein.mmfashion.mmfashion E/AndroidRuntime:  at com.blog.waiyanhein.mmfashion.model.ItemImagePager$1.onClick(ItemImagePager.java:54) 
04-10 11:05:38.938 28934-28934/com.blog.waiyanhein.mmfashion.mmfashion E/AndroidRuntime:  at android.view.View.performClick(View.java:4204) 
04-10 11:05:38.938 28934-28934/com.blog.waiyanhein.mmfashion.mmfashion E/AndroidRuntime:  at android.view.View$PerformClick.run(View.java:17355) 
04-10 11:05:38.938 28934-28934/com.blog.waiyanhein.mmfashion.mmfashion E/AndroidRuntime:  at android.os.Handler.handleCallback(Handler.java:725) 
04-10 11:05:38.938 28934-28934/com.blog.waiyanhein.mmfashion.mmfashion E/AndroidRuntime:  at android.os.Handler.dispatchMessage(Handler.java:92) 
04-10 11:05:38.938 28934-28934/com.blog.waiyanhein.mmfashion.mmfashion E/AndroidRuntime:  at android.os.Looper.loop(Looper.java:137) 
04-10 11:05:38.938 28934-28934/com.blog.waiyanhein.mmfashion.mmfashion E/AndroidRuntime:  at android.app.ActivityThread.main(ActivityThread.java:5041) 
04-10 11:05:38.938 28934-28934/com.blog.waiyanhein.mmfashion.mmfashion E/AndroidRuntime:  at java.lang.reflect.Method.invokeNative(Native Method) 
04-10 11:05:38.938 28934-28934/com.blog.waiyanhein.mmfashion.mmfashion E/AndroidRuntime:  at java.lang.reflect.Method.invoke(Method.java:511) 
04-10 11:05:38.938 28934-28934/com.blog.waiyanhein.mmfashion.mmfashion E/AndroidRuntime:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
04-10 11:05:38.938 28934-28934/com.blog.waiyanhein.mmfashion.mmfashion E/AndroidRuntime:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
04-10 11:05:38.938 28934-28934/com.blog.waiyanhein.mmfashion.mmfashion E/AndroidRuntime:  at dalvik.system.NativeStart.main(Native Method) 

S'il vous plaît aide moi comment puis-je réparer mon code? Merci.

+0

Où avez-vous créé cet adaptateur? dans une activité? –

+0

Oui. Au sein d'une activité, j'ai transmis getBaseContext() au premier paramètre. –

+0

Utilisez l'activité elle-même car le contexte résoudra le problème. ex: MyActivity.this au lieu de getBaseContext() –

Répondre

1

add - FLAG_ACTIVITY_NEW_TASK drapeau à votre intention:

myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  

Ou vous devriez essayer en ajoutant des drapeaux:

myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
+0

J'ai essayé comme ça. Mais ça ne marche pas aussi bien. Intention i = nouvelle intention (mContext, ViewImageActivity.class); i.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK); i.putExtra ("url", mResources.get (position)); mContext.startActivity (i); –

+0

Maintenant, vous devriez essayer au lieu de mettre les drapeaux utilisent addFlage –

+0

J'ai essayé addFlags.Mais ça ne marche pas aussi bien. –

0

mContext est pas un Activity, apparemment. Il devrait être, tout comme vous devriez obtenir mLayoutInflater en appelant getLayoutInflater() sur un Activity, de sorte que votre thème est respecté. Etant donné que vous n'implémentez aucun des constructeurs normaux View, il est clair que vous êtes celui qui crée votre instance de ItemImagePager, plutôt que le framework qui le fait (par exemple, en gonflant une disposition).

Ainsi, vos options sont:

  1. Modifier votre code qui crée le ItemImagePager de passer dans un Activity comme premier paramètre (et, idéalement, résoudre ce problème LayoutManager bits) ou

  2. Lire le message d'erreur et faire exactement ce qu'il vous dit de faire: ajouter FLAG_ACTIVITY_NEW_TASK au Intent

+1

'ItemImagePager' est un adaptateur, pas un' View'. –

+1

@MikeM .: Ah, bon point. Il est trop tôt ici. Strikethrough appliqué. Merci! – CommonsWare

+0

J'ai transmis getBaseContect() au premier paramètre de l'activité et j'ai défini i.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK); à mon intention. Mais ça ne marche toujours pas. –