2012-12-20 33 views
3

我在列表视图中创建了多个布局,但是当我单击时我得到一个AndroidRuntimeException“从Activity上下文外部调用startActivity()需要FLAG_ACTIVITY_NEW_TASK国旗,这真的是你想要的吗?“AndroidRuntimeException“从活动上下文外部调用startActivity()需要FLAG_ACTIVITY_NEW_TASK标志”

林添加

Intent.FLAG_ACTIVITY_NEW_TASK

到我的意图,但我得到了同样的信息! =(

 @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; 
     } 
+1

你从哪里获得mContext?它是一个活动上下文还是应用程序或服务上下文? – iagreen

回答

0

我已经加入:

parent.getApplicationContext()

而不只是:

getApplicationContext()

整线:

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

更换getApplicationContext()this。最有可能的情况是,您应该在代码中执行此操作,您的代码中有getApplicationContext() - 只有在您明确需要Application对象时才使用getApplicationContext()

+0

嗨墨菲先生,我试过“这个”,但我得到了同样的例外=( – Jorgesys

+1

@Jorgesys:另外,摆脱所有'mContext'的出现,其中'mContext'是一个参数',使用'this'或' NameOfYourActivityClass.this'。 – CommonsWare

0
CustomAdapter mAdapter = new CustomAdapter(getApplicationContext(), yourlist); 

Context mContext = getAppliactionContext(); 

CustomAdapter mAdapter = new CustomAdapter(mContext, yourlist); 

变化以下

CustomAdapter mAdapter = new CustomAdapter(this, yourlist); 
1

旧线程,但想到这个简单的解决方案可以帮助别人。而不是传递上下文,只是从视图中获取它。对于如: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); 
} 
-1

由于CommonsWare我想出了这个解决方案,效果最好。

我添加了一个新的类

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

所有我需要做的然后添加下面的代码,每个活动的onCreate我浏览到。

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

这允许新的意图开始,就像它正常的应用程序流一样,这样我就不必为意图设置一个标志。

调用开始活动的方法是一样容易:

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

希望这可以帮助别人,因为它已经帮助了我。

谢谢CommonsWare。

0

沃伦Lankie范·托德的解决方案是几乎好:

- 你应该避免使用活动情境,选择应用程序上下文相反,目的是防止内存泄漏。 Android开发人员的这个博客解释说,http://android-developers.blogspot.be/2009/01/avoiding-memory-leaks.html

但是在Activity的情况下,您的代码是唯一的解决方案(也许用于调用活动外的另一个活动)并且关于上面的链接,您必须释放每个onPause()中的静态引用与

AppGlobals.setAppContext(null);

作为回报,在静态字段中设置onResume而不是onCreate。

相关问题