424

ListViewAndroidアプリケーションにを実装しました。ListViewクラスのカスタムサブクラスを使用してこれにバインドしArrayAdapterます。オーバーライドされたArrayAdapter.getView(...)メソッド内で、を割り当てますOnClickListener。のonClick方法でOnClickListener、新しい活動を始めたいと思います。例外が発生します:

Calling startActivity() from outside of an Activity  context requires the  
FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?

(現在の)が機能しContextていることをどのように取得できますか?ListViewActivity

4

27 に答える 27

652

また

  • アダプタのコンストラクタを介してContextオブジェクトをキャッシュするか、または
  • あなたの視点からそれを取得します。

または最後の手段として、

  • 追加-FLAG_ACTIVITY_NEW_TASKフラグをインテントに追加します。

_

myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

編集-イベントと履歴スタックの通常のフローを妨げるため、フラグの設定は避けます。

于 2010-10-12T20:40:14.783 に答える
109

代わりにaddFlagsでそれを達成することができますsetFlags

myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

ドキュメントによると、それは行います:

インテントに(または既存のフラグ値を使用して)フラグを追加します。


編集

Alex Volovoyの回答にあるように、履歴スタックを変更する可能性のあるフラグを使用する場合は注意してください。

...イベントと履歴スタックの通常のフローを妨げるため、フラグの設定は避けてください。

于 2012-11-25T08:33:40.240 に答える
74

(getApplicationContext)使用する代わりにYourActivity.this

于 2016-07-27T08:44:42.123 に答える
59

以下のようなcreatechooserを使用したためにエラーが発生した場合:

Intent sharingIntent = new Intent(Intent.ACTION_VIEW);
sharingIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
sharingIntent.setData(Uri.parse("http://google.com"));
startActivity(Intent.createChooser(sharingIntent, "Open With"));

フラグを設定して、次のようなチューザーを作成します。

Intent sharingIntent = new Intent(Intent.ACTION_VIEW);
sharingIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
sharingIntent.setData(Uri.parse("http://google.com"));

Intent chooserIntent = Intent.createChooser(sharingIntent, "Open With");
chooserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

startActivity(chooserIntent);
于 2016-09-29T01:32:27.480 に答える
15

さらに、フラグメントのリストビューにリンクを表示する場合は、このように作成しないでください

adapter = new ListAdapter(getActivity().getApplicationContext(),mStrings);

代わりに

adapter = new ListAdapter(getActivity(),mStrings);

アダプターはどちらの場合も正常に機能しますが、リンクは最後の1つでのみ機能します。

于 2014-09-02T17:52:12.283 に答える
14

OnClickListenerを間違った場所に実装している可能性があります。通常は、アクティビティにOnItemClickListenerを確実に実装し、代わりにListViewに設定する必要があります。そうしないと、イベントで問題が発生します...

于 2010-10-12T20:14:51.590 に答える
9
CustomAdapter mAdapter = new CustomAdapter( getApplicationContext(), yourlist);

また

Context mContext = getAppliactionContext();
CustomAdapter mAdapter = new CustomAdapter( mContext, yourlist);

以下に変更

CustomAdapter mAdapter = new CustomAdapter( this, yourlist);
于 2014-05-21T08:59:14.133 に答える
9

startActivityAndroid 28(Android P)

if ((intent.getFlags() & Intent.FLAG_ACTIVITY_NEW_TASK) == 0
        && (targetSdkVersion < Build.VERSION_CODES.N
                || targetSdkVersion >= Build.VERSION_CODES.P)
        && (options == null
                || ActivityOptions.fromBundle(options).getLaunchTaskId() == -1)) {
    throw new AndroidRuntimeException(
            "Calling startActivity() from outside of an Activity "
                    + " context requires the FLAG_ACTIVITY_NEW_TASK flag."
                    + " Is this really what you want?");
}

だから最良の方法は追加することですFLAG_ACTIVITY_NEW_TASK

Intent intent = new Intent(context, XXXActivity.class);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
context.startActivity(intent);
于 2019-08-14T08:29:00.463 に答える
8

ある方法でlistiner内にインテントを作成している場合を参照してください

override onClick (View v).

次に、このビューからもコンテキストを呼び出します。

v.getContext ()

SetFlagsも必要ありません...

于 2016-03-11T12:27:33.070 に答える
4

StartActivityがアクティビティから呼び出された場合でもXamarin.Android(MonoDroid)でこれを取得する人は、これは実際には新しいARTランタイムを使用したXamarinのバグです。https://bugzilla.xamarin.com/show_bug.cgi?id=17630を参照してください。

于 2014-02-25T15:19:42.040 に答える
3

このエラーは、startactivityが自分のアクティビティを認識していない場合に発生します。したがって、startActivity()の前にアクティビティを追加する必要があります

設定する必要があります

context.startActivity(yourIntent);
于 2014-09-05T08:19:39.493 に答える
3

AlexVolovoyの答えをもう少し詳しく説明します-

uがフラグメントでこの問題を抱えている場合、getActivity()はコンテキストを取得するために正常に機能します

その他の場合:

使いたくない場合-

myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//not recommend

次に、OutsideClassでこのような関数を作成します-

public void gettingContext(Context context){
    real_context = context;//where real_context is a global variable of type Context
}

これで、メインアクティビティで、新しいOutsideClassを作成するたびに、アクティビティのコンテキストを引数として指定するOutsideClassを定義した直後に、上記のメソッドを呼び出します。また、あなたの主な活動で機能を作ります-

public void startNewActivity(final String activity_to_start) {
    if(activity_to_start.equals("ACTIVITY_KEY"));
    //ACTIVITY_KEY-is a custom key,just to
    //differentiate different activities
    Intent i = new Intent(MainActivity.this, ActivityToStartName.class);
    activity_context.startActivity(i);      
}//you can make a if-else ladder or use switch-case

今度はOutsideClassに戻り、新しいアクティビティを開始するには、次のようにします-

@Override
public void onClick(View v) {
........
case R.id.any_button:

            MainActivity mainAct = (MainActivity) real_context;             
            mainAct.startNewActivity("ACTIVITY_KEY");                   

        break;
    }
........
}

このようにして、フラグを台無しにすることなく、さまざまなOutsideClassから呼び出されるさまざまなアクティビティを開始できます。

注–フラグメントのコンストラクターを介してコンテキストオブジェクトをキャッシュしないようにしてください(アダプターを使用すると、問題ありません)。フラグメントには空のコンストラクターが必要です。そうしないと、一部のシナリオでアプリケーションがクラッシュします。

電話することを忘れないでください

OutsideClass.gettingContext(Context context);

onResume()関数でも同様です。

于 2014-10-21T17:21:18.593 に答える
2

私の意見でstartActivity()は、のコードでのメソッドを使用する方が良いと思いますActivity.classAdapterまたは他のクラスでそれを使用すると、その結果になります。

于 2014-08-28T03:42:26.683 に答える
2

私も同じ問題を抱えていました。渡したすべてのコンテキストを確認してください。'リンク'の場合、アプリケーションコンテキストではなくアクティビティコンテキストが必要です。

これはあなたがチェックすべき場所です:

1.)LayoutInflaterを使用した場合は、渡したコンテキストを確認してください。

2.)アダプタを使用している場合は、渡したコンテキストを確認してください。

于 2015-06-12T07:06:40.880 に答える
2

私も同じ問題を抱えていました。問題はコンテキストにあります。リンクを開きたい場合(たとえば、チューザーを介してリンクを共有したい場合)、アプリケーションコンテキストではなく、アクティビティコンテキストを渡します。

myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)活動していない場合は、追加することを忘れないでください。

于 2015-12-21T12:40:13.887 に答える
2

このコードをAdapter_Activityで使用context.startActivity(intent_Object)し、intent_Object.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

このような:

Intent n_act = new Intent(context, N_Activity.class);
n_act.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(n_act);

できます....

于 2019-02-01T11:56:20.373 に答える
1
Intent viewIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);    
viewIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);    
startActivity(viewIntent);   

これがうまくいくことを願っています。

于 2015-09-11T06:26:36.290 に答える
1

同じ問題に直面し、その後実装されました

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

そして問題を解決しました。

リストビューアダプタに関連する別の理由がある可能性があります。あなたはこのブログ
を見ることができます、それを非常によく説明しました。

于 2017-06-24T18:24:23.717 に答える
1

このコードを使用してください。私にとってはうまくいきます。アクティビティの外部から何かを共有する:

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");

// Append Text
String Text = "Your Text Here"

intent.putExtra(Intent.EXTRA_TEXT, Text);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

Intent shareIntent = Intent.createChooser(intent,"Share . . . ");
shareIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
G.context.getApplicationContext().startActivity(shareIntent);
于 2017-09-05T05:34:15.287 に答える
1

フラグを追加すると影響がevent_flowありstack_history、次の方法でアクティビティクラスを呼び出す必要がある場所から非アクティビティに「アプリケーションコンテキスト」を渡す方が適切です。

"ActivityClassName.this"(この方法でコンテキストを渡すと、非アクティビティシナリオからアクティビティを呼び出すために必要なすべての詳細と情報が含まれます)

したがって、フラグを設定または追加する必要はありません。これはすべての場合に正常に機能します。

于 2018-05-24T12:49:34.460 に答える
1

アクティビティ(アダプタを呼び出している場所)で、を変更getActivityContext()するだけYourActivity.thisです。次に例を示します。

yourAdapter = new YourAdapter(yourList, YourActivity.this); // Here YourActivity.this is the Context instead of getActivityContext()
recyclerView.setAdapter(yourAdapter);
于 2020-09-29T12:23:24.030 に答える
0
Intent i= new Intent(context, NextActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
于 2016-09-08T10:20:45.870 に答える
0

Cordovaプラグインで共有インテントを呼び出す場合、フラグを設定しても効果はありません。代わりにこれを使用してください-

cordova.getActivity().startActivity(Intent.createChooser(shareIntent, "title"));
于 2017-11-27T17:41:12.177 に答える
0

私の状況は少し異なり、を使用してアプリをテストしており、インストルメンテーションからEspressoアクティビティを起動する必要がありました(これはからのものではありません)。ActivityTestRuleContextActivity

fun intent(context: Context) = 
    Intent(context, HomeActivity::class.java)
        .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)

フラグを変更し、 ( Javaで)orビット単位で追加する必要がありました。|Intent.FLAG_ACTIVITY_NEW_TASK

したがって、次のようになります。

fun intent(context: Context) = 
    Intent(context, HomeActivity::class.java)
        .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK)
于 2018-01-25T15:00:23.830 に答える
0

Kotlinバージョン

val intent = Intent(Intent.ACTION_EDIT, ContactsContract.Profile.CONTENT_URI)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
this.startActivity(intent)
于 2019-07-04T10:41:08.797 に答える
0

データバインディングを使用する場合は、コンテキストを取得するだけです

binding.root.context

これで私の問題は解決しました。

于 2022-01-31T10:54:58.813 に答える
0

アクティビティコンテキストの外部からstartActivity()を呼び出すと、ビューから取得されます

しないでください

val context = activity.applicationContext
openBrowser(context, MenuUrl.TERM_CONDITION)

行う

   1. val context = binding.root.context // If you are using view binding
   2. val context = yourView.context // If you are not use view binding
    openBrowser(context, MenuUrl.TERM_CONDITION)

ありがとうございました。

于 2022-02-26T05:35:51.930 に答える