5
votes

I create multiple layouts inside a listview, but when i click i get a AndroidRuntimeException "Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?"

Im adding

Intent.FLAG_ACTIVITY_NEW_TASK

to my intent but i get the same message! =(

      @Override
            public View getView(int position, View convertView, ViewGroup parent) {

                    retval=LayoutInflater.from(getApplicationContext()).inflate(R.layout.layout_anuncio, null);
                    ImageView image=(ImageView) retval.findViewById(R.id.imageAD);
                    LoadAds loadAds= new CargaAnuncios();
                    clickUrl = LoadAds.cargaImagenAnuncio(image, mContext, GlobalInfo.ANUNCIO_CARRIL_PORTADA);
                    image.setOnClickListener(new OnClickListener(){

                        @Override
                        public void onClick(View view) {
                            Bundle bundle=new Bundle();
                            bundle.putString("url", clickUrl);
                            Intent intent =new Intent(mContext,CustomWebView.class);
                            intent.putExtras(bundle);
                            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                            mContext.startActivity(intent);
                        }

                    });
            return retval;
        }
6
Where are you getting mContext from? Is it an Activity context or perhaps an application or service context?iagreen

6 Answers

19
votes

Replace getApplicationContext() with this. Most likely, you should do that everywhere in your code that you have getApplicationContext() -- only use getApplicationContext() when you specifically need the Application object.

2
votes

Old thread, but thought this easy solution might help someone. Instead of passing context around, just get it from view. For eg: view.getContext()

@Override
public void onClick(View view) {
    Bundle bundle=new Bundle();
    bundle.putString("url", clickUrl);
    Intent intent =new Intent(view.getContext(),CustomWebView.class);
    intent.putExtras(bundle);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    view.getContext().startActivity(intent);
}
0
votes

I have added:

parent.getApplicationContext()

Instead of just:

getApplicationContext()

Whole line is:

retval=LayoutInflater.from(parent.getApplicationContext()).inflate(R.layout.layout_anuncio, null);
0
votes

The solution of Warren Lankie Van Tonder is almost the good:

-You should avoid using Activity context and choose Application Context instead, in purpose to prevent memory leaks. This blog of an Android developer explains that http://android-developers.blogspot.be/2009/01/avoiding-memory-leaks.html

-But in the case of Activity context is the only solution for your code (maybe for calling another activity from outside an activity) and regarding the link above, you have to release the static reference in each onPause() with

AppGlobals.setAppContext(null);

In return, set the static field in onResume and not onCreate.

-1
votes

Thanks to CommonsWare i came up with this solution which worked best.

I added a new class

package com.test.test;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;

public class AppGlobals extends Activity {
    private static Context appContext;

    public static Context getAppContext(){
        return appContext;
    }

    public static void setAppContext(Context context){
        appContext = context;
    }

    public static void StartActivity(Intent intent){
        appContext.startActivity(intent);
    }
}

All i needed to do then was add the below code on each activity onCreate that i navigated to.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);
    AppGlobals.setAppContext(this);
}

This allowed the new intent to start as if it working with normal application flow and this way i didn't have to set a Flag for the intent.

Calling the start activity method is as easy as:

Intent totalTimerIntent = new Intent(AppGlobals.getAppContext(), TotalTimer.class);
AppGlobals.StartActivity(totalTimerIntent);

Hope this helps someone as it has helped me.

Thank you CommonsWare.

-1
votes
CustomAdapter mAdapter = new CustomAdapter( getApplicationContext(), yourlist);

or

Context mContext = getAppliactionContext();

CustomAdapter mAdapter = new CustomAdapter( mContext, yourlist);

change to below

CustomAdapter mAdapter = new CustomAdapter( this, yourlist);