どういうわけか、ポップアップダイアログ(またはダイアログテーマを持つアクティビティ)の外をタップすることができたら、それを外して閉じることができますか?Androidの外のダイアログをタップして閉じますか?
私はそれを説明するために迅速な絵を作っ:
通常は、ダイアログを閉じ、バックキーを押す必要があるが、ハニカムに、それだけで叩くのオプションを持っているのは素晴らしいことができすべての画面の不動産のため、ダイアログの外にあります。
どういうわけか、ポップアップダイアログ(またはダイアログテーマを持つアクティビティ)の外をタップすることができたら、それを外して閉じることができますか?Androidの外のダイアログをタップして閉じますか?
私はそれを説明するために迅速な絵を作っ:
通常は、ダイアログを閉じ、バックキーを押す必要があるが、ハニカムに、それだけで叩くのオプションを持っているのは素晴らしいことができすべての画面の不動産のため、ダイアログの外にあります。
です。私の場合、他の答えはうまくいかなかった。他のバックグラウンドアプリや起動画面にタッチイベントを受信させるだけでした。
私の場合はdispatchTouchEventを使用していることがわかりました。私はそれももっと簡単な解決策だと思う。ここでダイアログをテーマに活動外のタップを検出するためにそれを使用する方法についていくつかのサンプルコードです:ウィンドウの境界の外に触れたときに、このダイアログがキャンセルされた
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
Rect dialogBounds = new Rect();
getWindow().getDecorView().getHitRect(dialogBounds);
if (!dialogBounds.contains((int) ev.getX(), (int) ev.getY())) {
// Tapped outside so we finish the activity
this.finish();
}
return super.dispatchTouchEvent(ev);
}
if条件を 'if(!dialogBounds.contains(int)event.getX()、(int)event.getY())&& event.getAction()== MotionEvent.ACTION_DOWN)に変更すると、そうすれば、ユーザが誤って指を「アクティビティ」の外に動かすと、それは終了しません。 – Glitch
それは素晴らしいです、グリッチ - ありがとう。 –
APIレベル8の使用、テーマ 'android:Theme.Dialog'を使用し、このコードでアクティビティを使用する: 'dialogBounds.top'および' dialogBounds.left'の値は0です。 'dialogBounds.bottom'と' dialogBounds.right'は画面サイズの値を持っており、実際にはdiologウィンドウがフルスクリーンであると考えられます。だから私はこのコードを動作させることはできません。これがなぜ起こっているのか他のアイデアですか? – Jorge
ます。たとえば、ポップアップウィンドウ
のうち側に触れたときに
mWindow.setTouchInterceptor(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
mWindow.dismiss();
return true;
}
return false;
}
});
mWindow
がポップアップウィンドウ
であり、あなたがのために同じ機能が必要な場合に呼び出されますTouchInterceptor
方法がありますアクティビティは以下の手順に従ってください。
1)onCreate();
getWindow().setFlags(LayoutParams.FLAG_NOT_TOUCH_MODAL, LayoutParams.FLAG_NOT_TOUCH_MODAL);
// ...but notify us that it happened.
getWindow().setFlags(LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);
2で呼び出さsetContentView()
メソッドの前にフラグを追加します)完全なコピーがここに
でonTouchEvent()
イベントをオーバーライドし、コード
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
Toast.makeText(getApplicationContext(), "Finish", 3000).show();
finish();
return true;
}
return false;
}
下に書きます
活動
package net.londatiga.android;
import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.WindowManager.LayoutParams;
import android.widget.Button;
import android.widget.Toast;
public class NewQuickAction3DActivity extends Activity implements OnTouchListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Make us non-modal, so that others can receive touch events.
getWindow().setFlags(LayoutParams.FLAG_NOT_TOUCH_MODAL, LayoutParams.FLAG_NOT_TOUCH_MODAL);
// ...but notify us that it happened.
getWindow().setFlags(LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);
setContentView(R.layout.main);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
Toast.makeText(getApplicationContext(), "Hi", 3000).show();
return true;
}
return false;
}
}
は、これは私のアプリはTheme.Holo.Dialogを持つ単一の活動であるのmanifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="net.londatiga.android"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="7" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".NewQuickAction3DActivity"
android:label="@string/app_name" android:theme="@android:style/Theme.Holo.Dialog">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
これは 'PopupWindow'のためだけです、そうですか?私はHoneycombのTheme.Holo.Dialogテーマで標準アクティビティを使用しています。 –
私は自分の答えを編集しています – Dharmendra
ええ、書いた前に試してみましたが、どちらもうまくいきませんでした:(仕上げのセミコロンがありません)btw :) –
dialog.setCanceledOnTouchOutside(true)
かどうかを設定。
これは最高の解決策です...だから簡単です。なぜこれは答えではないのですか? –
ダイアログテーマのあるアクティビティで作業する必要がありましたが、この場合は機能しませんが、一般的なダイアログのためにアップウィートしました。 –
'this.setFinishOnTouchOutside(false);'ダイアログアクティビティで動作します – Nick
ダイアログがActivity
の場合は、Activity#setFinishOnTouchOutsideも使用できます。 )
(ただし、API 11+ですが、API < = 10は一般的には画面サイズが標準です。)
を使用するようにDIAを使用し、問題は、アクティビティダイアログなどをテーマに取り組んでいますダイアログではありません。 – JaredBanyard
古い質問が、まだ別の解決策:
があなたのフォアグラウンド・アクティビティフルスクリーンにします。慣れ親しんだレイアウト:全画面レイアウトは透明な背景(例えば、@null
または@android:color/transparent
)を持つ必要があります。内側のレイアウトには背景が表示されている必要があります。
あなたのアクティビティがfinish()
である目に見えない外枠にOnClickListener
を追加します。
ダイアログ内の任意のビューは、タッチイベントを消費するように設定されているため、以下は呼び出されません。
onCreate(){
getWindow().getDecorView().getRootView().setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event) {
dialog.dismiss();
return false;
}
});
LayoutParams lp=dialogp.getWindow().getAttributes();
lp.flags=LayoutParams.FLAG_LAYOUT_NO_LIMITS;
私はこれを追加し、それが3.0までに完璧に動作しますが、すべてで動作するはずです。
他のスタイルではなくダイアログのスタイルを使用します。あなたはTheme_Translucent_NoTitleBarのような他のスタイルを使用する場合たとえば
は、
public YourCustomDialog(Context context) {
super(context, android.R.style.Theme_Holo_dialog_NoActionBar);
}
を使用して、ダイアログが却下されることはありません。
あなたは、Androidの最新のvesrionsについて
dialog.setCancelable(true\false);
を使用することができます。
outSideTouchingイベントを無効にします。あなたがコードやない....
dialog.setCanceledOnTouchOutside(true);
どのバージョンですか? – AbleArcher
KITKATを除くすべてのバージョンでテスト済みです:) – Amt87
dialog = new Dialog(MainActivity.this);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.dialog_layout);
dialog.getWindow().setBackgroundDrawableResource(
android.R.color.transparent);
dialog.setCancelable(false);
dialog.setCanceledOnTouchOutside(true);
。それは私のために働く、窓は外のタップで却下しません。
のこのラインを持っている場合は、チェックは単に私がdialog.setCanceledOnTouchOutside(false)を書く
this.setFinishOnTouchOutside(false);
あなたはこれを使うことができます
少なくとも、ダイアログテーマ付きアクティビティの場合、デフォルトの動作であると思います。 –