5

リストビュー内に複数のレイアウトを作成しましたが、クリックすると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;
        }
4

6 に答える 6

19

に置き換えgetApplicationContext()ますthis。ほとんどの場合、これはコード内のあらゆる場所で行う必要があります。特にオブジェクトが必要な場合にgetApplicationContext()のみ使用してください。getApplicationContext()Application

于 2012-12-20T18:32:41.260 に答える
2

古いスレッドですが、この簡単な解決策が誰かを助けるかもしれないと思いました。コンテキストを渡す代わりに、ビューから取得します。例: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);
}
于 2015-12-14T05:42:55.367 に答える
0

私が追加しました:

parent.getApplicationContext()

ただの代わりに:

getApplicationContext()

全体の行は次のとおりです。

retval=LayoutInflater.from(parent.getApplicationContext()).inflate(R.layout.layout_anuncio, null);
于 2012-12-20T18:25:42.397 に答える
0

Warren Lankie VanTonderの解決策はほとんど良いです:

-メモリリークを防ぐために、アクティビティコンテキストの使用を避け、代わりにアプリケーションコンテキストを選択する必要があります。Android開発者のこのブログでは、http://android-developers.blogspot.be/2009/01/avoiding-memory-leaks.htmlについて説明しています。

-しかし、Activityコンテキストの場合は、コードの唯一の解決策(おそらく、アクティビティの外部から別のアクティビティを呼び出すため)であり、上記のリンクに関しては、各onPause()の静的参照を次のように解放する必要があります。

AppGlobals.setAppContext(null);

代わりに、onCreateではなくonResumeに静的フィールドを設定します。

于 2016-07-11T16:07:41.763 に答える
-1
CustomAdapter mAdapter = new CustomAdapter( getApplicationContext(), yourlist);

また

Context mContext = getAppliactionContext();

CustomAdapter mAdapter = new CustomAdapter( mContext, yourlist);

以下に変更

CustomAdapter mAdapter = new CustomAdapter( this, yourlist);
于 2014-05-21T08:55:42.687 に答える
-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);
    }
}

次に、ナビゲートしたCreateの各アクティビティに以下のコードを追加するだけで済みました。

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

これにより、新しいインテントが通常のアプリケーションフローで機能しているかのように開始できるようになり、この方法でインテントにフラグを設定する必要がなくなりました。

startアクティビティメソッドの呼び出しは次のように簡単です。

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

それが私を助けたので、これが誰かを助けることを願っています。

CommonsWareに感謝します。

于 2016-01-20T08:55:34.297 に答える