Andoridアプリのディスプレイ広告にDialog
を使用しました。しかし、これをDialog
を約50dpの上部から表示する必要があるので、Dialog
重力ボタンを設定して、そのマージンは50 dpですが、Dialog
。ではマージンを使用できません。解決方法を教えてください。
XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/popup_element"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:background="@drawable/dialogback"
Android:orientation="vertical" >
<WebView
Android:id="@+id/webView"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content" />
</LinearLayout>
Java:
final Dialog dialog = new Dialog(this);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(0));
LayoutInflater inflator = (LayoutInflater) getApplicationContext()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflator.inflate(R.layout.ad, null, false);
dialog.setContentView(view);
dialog.getWindow().setGravity(Gravity.BOTTOM);
dialog.setCancelable(true);
WebView webView = (WebView) dialog.findViewById(R.id.webView);
webView.loadUrl("");
webView.setWebViewClient(new MyWebViewClient());
webView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
dialog.dismiss();
}
});
dialog.show();
私も似たようなスマイリーダイアログを行いました。ダイアログを拡張します
public class SmileCustomDialog extends Dialog {
Context mcontext;
GridView mGridview;
public GridView getGridview() {
return mGridview;
}
public SmileCustomDialog(final Context context) {
super(context, R.style.SlideFromBottomDialog);
this.mcontext = context;
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = inflater.inflate(R.layout.emocategorydialog, null);
mGridview = (GridView) v.findViewById(R.id.emogrid);
mGridview.setSelector(new ColorDrawable(Color.TRANSPARENT));
ImageAdapter mAdapter = new ImageAdapter(mcontext);
mGridview.setAdapter(mAdapter);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
this.setContentView(v);
WindowManager.LayoutParams params = this.getWindow().getAttributes();
this.setCanceledOnTouchOutside(true);
params.y = -100;
this.getWindow().setAttributes(params);
}
}
しかし、本質は
WindowManager.LayoutParams params = yourDialog.getWindow().getAttributes(); // change this to your dialog.
params.y = -100; // Here is the param to set your dialog position. Same with params.x
yourDialog.getWindow().setAttributes(params);
ダイアログを表示する前にこれを追加してください。
WindowManager.LayoutParams:
public int x:X position ... LEFTまたはSTARTまたはRIGHTまたはENDを使用する場合、指定されたエッジからのオフセットを提供します
public int y:Y position ... TOPまたはBOTTOMを使用する場合、指定されたエッジからのオフセットを提供します
( http://developer.Android.com/reference/Android/view/WindowManager.LayoutParams.html#x )
したがって:
final Dialog dialog = new Dialog(context);
// ...
//たとえば上部+右余白:
dialog.getWindow()。setGravity(Gravity.TOP | Gravity.RIGHT);
WindowManager.LayoutParams layoutParams = dialog.getWindow()。getAttributes();
layoutParams.x = 100; //右マージン
layoutParams.y = 170; //上マージン
dialog.getWindow()。setAttributes(layoutParams);
//例えば下+左マージン:
dialog.getWindow()。setGravity(Gravity.BOTTOM | Gravity.LEFT);
WindowManager.LayoutParams layoutParams = dialog.getWindow()。getAttributes();
layoutParams.x = 100; //左マージン
layoutParams.y = 170; //下マージン
dialog.getWindow()。setAttributes(layoutParams);
// etc.
View view = layoutInflater.inflate(R.layout.dialog_layout, null);
AlertDialog infoDialog = new AlertDialog.Builder(this)
.setView(view)
.create();
Window window =infoDialog.getWindow();
window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND );
WindowManager.LayoutParams wlp = window.getAttributes();
wlp.gravity = Gravity.BOTTOM;
wlp.dimAmount=(float) 0.0;
//wlp.flags = WindowManager.LayoutParams.FLAG_DIM_BEHIND ;
window.setAttributes(wlp);
infoDialog.show();
重力を下に変更
これは、重力を気にすることなく4つのマージンすべてを設定するアプローチです。
DialogFragment
メソッドに適用することで、onCreateDialog
のアプローチをテストしました。
public Dialog onCreateDialog( Bundle savedInstanceState )
{
// create dialog in an arbitrary way
Dialog dialog = super.onCreateDialog( savedInstanceState );
DialogUtils.setMargins( dialog, 0, 150, 50, 75 );
return dialog;
}
これはダイアログにマージンを適用する方法です:
public static Dialog setMargins( Dialog dialog, int marginLeft, int marginTop, int marginRight, int marginBottom )
{
Window window = dialog.getWindow();
if ( window == null )
{
// dialog window is not available, cannot apply margins
return dialog;
}
Context context = dialog.getContext();
// set dialog to fullscreen
RelativeLayout root = new RelativeLayout( context );
root.setLayoutParams( new ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT ) );
dialog.requestWindowFeature( Window.FEATURE_NO_TITLE );
dialog.setContentView( root );
// set background to get rid of additional margins
window.setBackgroundDrawable( new ColorDrawable( Color.WHITE ) );
// apply left and top margin directly
window.setGravity( Gravity.LEFT | Gravity.TOP );
LayoutParams attributes = window.getAttributes();
attributes.x = marginLeft;
attributes.y = marginTop;
window.setAttributes( attributes );
// set right and bottom margin implicitly by calculating width and height of dialog
Point displaySize = getDisplayDimensions( context );
int width = displaySize.x - marginLeft - marginRight;
int height = displaySize.y - marginTop - marginBottom;
window.setLayout( width, height );
return dialog;
}
使用したヘルパーメソッドは次のとおりです。
@NonNull
public static Point getDisplayDimensions( Context context )
{
WindowManager wm = ( WindowManager ) context.getSystemService( Context.WINDOW_SERVICE );
Display display = wm.getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
display.getMetrics( metrics );
int screenWidth = metrics.widthPixels;
int screenHeight = metrics.heightPixels;
// find out if status bar has already been subtracted from screenHeight
display.getRealMetrics( metrics );
int physicalHeight = metrics.heightPixels;
int statusBarHeight = getStatusBarHeight( context );
int navigationBarHeight = getNavigationBarHeight( context );
int heightDelta = physicalHeight - screenHeight;
if ( heightDelta == 0 || heightDelta == navigationBarHeight )
{
screenHeight -= statusBarHeight;
}
return new Point( screenWidth, screenHeight );
}
public static int getStatusBarHeight( Context context )
{
Resources resources = context.getResources();
int resourceId = resources.getIdentifier( "status_bar_height", "dimen", "Android" );
return ( resourceId > 0 ) ? resources.getDimensionPixelSize( resourceId ) : 0;
}
public static int getNavigationBarHeight( Context context )
{
Resources resources = context.getResources();
int resourceId = resources.getIdentifier( "navigation_bar_height", "dimen", "Android" );
return ( resourceId > 0 ) ? resources.getDimensionPixelSize( resourceId ) : 0;
}
ヘルパーメソッドについては、別の SO回答 で説明しています。
この Gist には、没入モードをサポートする拡張バージョンも含まれています。
ええと、私にとって最も効果的なのは、FrameLayout内にダイアログビューをラップしてパディングを追加し、onClickListenerを「dismiss」ダイアログに設定することでした。このような:
<FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:id="@+id/parentFl"
Android:background="@Android:color/transparent"
Android:padding="@dimen/vvlarge_margin">
dialog?.window?.setBackgroundDrawable(context?.getDrawable(Android.R.color.transparent))
view.parentFl.setOnClickListener { dismiss() }
ダイアログのスタイルを作成し、そこにマージンを設定できます。
例えば:
<style name="custom_style_dialog">
<item name="Android:layout_marginStart">16dp</item>
<item name="Android:layout_marginEnd">16dp</item>
</style>
次に、ダイアログクラスで:
class CountryDialog(
context: Context
) : Dialog(context, R.style.custom_style_dialog) {
//your code here
}