目前,我有以下对话框,我将对其项目执行展开/折叠动画。
此对话框通过以下代码
创建import android.support.v7.app.AlertDialog;
final AlertDialog.Builder builder = new AlertDialog.Builder(activity);
final AlertDialog dialog = builder.setView(view).create();
final ViewTreeObserver vto = view.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
public void onGlobalLayout() {
ViewTreeObserver obs = view.getViewTreeObserver();
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) {
obs.removeOnGlobalLayoutListener(this);
} else {
obs.removeGlobalOnLayoutListener(this);
}
// http://stackoverflow.com/questions/19326142/why-listview-expand-collapse-animation-appears-much-slower-in-dialogfragment-tha
int width = dialog.getWindow().getDecorView().getWidth();
int height = dialog.getWindow().getDecorView().getHeight();
dialog.getWindow().setLayout(width, height);
}
});
然而,当执行动画时,这是副作用。
请注意,动画后对话框中不需要的额外白色区域不是由我们的自定义视图引起的。它是对话框本身的系统窗口白色背景。
我倾向于使对话框的系统窗口背景变得透明。
final AlertDialog.Builder builder = new AlertDialog.Builder(activity);
final AlertDialog dialog = builder.setView(view).create();
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
虽然不再看到不需要的白色背景,但对话框的原始边距也消失了。 (对话框宽度现在是全屏宽度)
如何在不影响其边际的情况下使其透明?
答案 0 :(得分:7)
有一种非常简单的方法:
您需要“修改”用作Drawable
背景的Dialog
。那些Dialogs
使用InsetDrawable
作为背景。
不幸的是,只有API> = 23的SDK允许您获取Drawable
(getDrawable()
方法)包装的源InsetDrawable
。有了这个,你可以做任何你想做的事 - 例如将颜色更改为完全不同的颜色(如RED
或其他内容)。如果您使用此方法,请记住包裹的Drawable
是GradientDrawable
而不是ColorDrawable
!
对于较低的API,您的(“优雅”)选项非常有限。
幸运的是,您无需将颜色更改为某些疯狂值,只需将其更改为TRANSPARENT
即可。为此,您可以在InsetDrawable
上使用setAlpha(...)
方法。
InsetDrawable background =
(InsetDrawable) dialog.getWindow().getDecorView().getBackground();
background.setAlpha(0);
编辑(Cheok Yan Cheng's评论的结果):
或者您实际上可以跳过转换为InsetDrawable
并获得相同的结果。请记住,这样做会导致alpha
本身更改InsetDrawable
而不会更改Drawable
所包含的InsetDrawable
。
答案 1 :(得分:2)
尝试以下主题:
<all_urls>
尝试以下代码将主题应用于predictCollectors
:
<style name="TransaparantDialog">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowFrame">@null</item>
<item name="android:windowTitleStyle">@null</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:backgroundDimEnabled">false</item>
<item name="android:background">@android:color/transparent</item>
<item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>
</style>
我希望能帮到你!
答案 2 :(得分:0)
你应该展示的是什么,我不确定它是你不知道的,或者它已经存在,所以你认为没有必要展示。
将主题设置为Dialog,将整个活动设置为一个Dialog。我认为你没有这样做,否则AlertDialog不会在那里。
我的描述有点丢失,但是有一点<shape/>
XML比9补丁更强大,使用RelativeLayout会有所帮助。
答案 3 :(得分:0)
作为compat库一部分的背景图像abc_popup_background_mtrl_mult
在图片信息中已包含边距。
这就是删除背景图像时边距消失的原因。我强烈建议不要使用ViewTreeObserver
,它会被多次调用,并可能导致性能问题。更好地使用屏幕尺寸:
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;
您的问题在布局中正确尝试使用层次结构查看器检查视图。
答案 4 :(得分:0)
只需在显示对话框后添加此行。我希望使用Dialog
AlertDialog
instedof
dialog.getWindow().setLayout(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
答案 5 :(得分:0)
让我们从谷歌推荐开始,它建议使用DialogFragment而不是简单的Dialog。
@rekire是正确的,由drawable设置的边距,前进它由9补丁或编程设置,具体取决于主题。
因此,您可以将填充设置为内容视图或使用DialogFragment创建对话框这里是一个根据内容更改对话框高度的示例,并注意您不需要使用之前提到的树观察器导致性能问题。
所以示例
dialog_confirm.xml
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="20dp">
<LinearLayout android:id="@+id/container"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:orientation="vertical"
android:animateLayoutChanges="true"
android:padding="15dp">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:padding="10dp"
android:text="A label text"
android:textAppearance="?android:attr/textAppearanceLarge"/>
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:padding="10dp"
android:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque mauris mi, dictum a lectus ut, facilisis"
android:textAppearance="?android:attr/textAppearanceMedium"/>
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="Remove Me"/>
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="Remove Me"/>
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="Remove Me"/>
<!-- as much content as you need -->
</LinearLayout>
</ScrollView>
注意:我将所有内容都包装到滚动视图中并设置填充,如果需要,可以跳过它。
ConfirmDialog.java
//here goes package name and imports
/**
* Created by Vilen - virtoos.com;
* fragment dialog example
*/
public class ConfirmDialog extends DialogFragment implements View.OnClickListener {
private Button button1;
private Button button2;
private Button button3;
private LinearLayout containerLayout;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(DialogFragment.STYLE_NO_TITLE, 0);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.dialog_confirm, container, false);
containerLayout = (LinearLayout)v.findViewById(R.id.container);
button1 = (Button)v.findViewById(R.id.button1);
button2 = (Button)v.findViewById(R.id.button2);
button3 = (Button)v.findViewById(R.id.button3);
button1.setOnClickListener(this);
button2.setOnClickListener(this);
button3.setOnClickListener(this);
return v;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// make background transparent if you want
//getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return super.onCreateDialog(savedInstanceState);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.button1:
containerLayout.removeView(button1);
break;
case R.id.button2:
containerLayout.removeView(button2);
break;
case R.id.button3:
containerLayout.removeView(button3);
break;
}
}
}
最后你可以用这段代码显示你的对话框
ConfirmDialog confirmDialog = new ConfirmDialog();
confirmDialog.show(getSupportFragmentManager(), "dialog");
我不会详细说明为什么Fragment对话框更好,但有一点很清楚,你可以为它封装逻辑并拥有单独的类。 希望这能解决你的问题。