いくつかの共通のインターフェイス要素を作成するために働いている会社のために、共通の再利用可能なクラスを作成しました。
クラスは、構成の場合と同様に、アプリケーションコンテキストという単一のパラメーターを取ります。
メソッドの1つであるContentClickableRowWithIcon
を使用すると、クリックアクションとして使用するインテントを渡すことができます。
ここに完全なメソッド宣言があります:
public LinearLayout ContentClickableRowWithIcon(Drawable icon, String title, Intent i, final Boolean chooser)
その最後の属性は、onClickEventで使用され、チューザーを呼び出すか、インテントに直接入るかを決定します。
_public LinearLayout ContentClickableRowWithIcon(Drawable icon, String title, Intent i, final Boolean chooser) {
LinearLayout ll = new LinearLayout(mContext);
// .. LinerLayout construction, has nothing to do with the action
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // this is apparently getting ignored... (ps: i've tried i.setFlags as well)
final Intent intent = i;
ll.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
if(chooser)
mContext.startActivity(Intent.createChooser(intent, "Complete With...")); // crashes here with: Android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
else
mContext.startActivity(intent); // this works fine
}
});
return ll;
}
_
コメントで述べたように、チューザーを使用する機能を提供しない場合はいつでも、すべてが正常に機能します(このリストのすべてが新しいアクティビティフラグを取得し、これを十分に認識しており、この問題が解決されるとクリーンアップされます)
私がやった瞬間、例外がスローされます:Android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
アイデアが足りなくなった...
///編集::デバッグ時に、onClickアクションでインテントを使用する時間に達すると、インテントのフラグ属性がaddFlagsで_268435456
_に設定され、setFlagsで_268435456
_に設定されることに注意してください。
問題は修正されました。これは単に「操作の順序」シナリオの場合だと思います。
これがこれを機能させた理由です:
ll.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
if(chooser) {
Intent intent = Intent.createChooser(i, "Complete With");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(intent);
} else
mContext.startActivity(i);
}
});
また、メソッド宣言のパラメーターに「final」修飾子を追加しました
public LinearLayout ContentClickableRowWithIcon(Drawable icon, String title, final Intent i, final Boolean chooser)
実際には、例外は、非アクティビティコンテキストを使用していることを意味します。アプリケーションコンテキストから呼び出すことができます。これはサービスではないため、アクティビティコンテキストにいることを確認してください
セレクターインテントにフラグを追加して修正しました
Intent sharingIntent = new Intent(Android.content.Intent.ACTION_SEND)
.setType("text/plain")
.putExtra(Android.content.Intent.EXTRA_SUBJECT, "Subject Here")
.putExtra(Android.content.Intent.EXTRA_TEXT, url)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(Intent.createChooser(sharingIntent, "Share with").addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));