使用 DialogFragment 的自定义警报对话框未按预期运行
Custom alert dialog using DialogFragment is not behaving as expected
我正在尝试实现自定义警报生成器,它应该显示我想要使用的自定义布局。我创建了一个名为 "AlertDialogClass" 的 class,它扩展了 DialogFragment。我正在尝试从片段中显示此警报生成器 class。
我在使用 AlertDialogClass 时没有收到任何错误或任何崩溃,但应该显示的布局仅显示白屏。我尝试了很多东西,但似乎没有任何效果。我不明白为什么会这样或者我做错了什么。
这是我的布局文件。
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="230dp"
xmlns:app="http://schemas.android.com/apk/res-auto"
app:cardBackgroundColor="@color/backgroundElevation2dp"
app:cardCornerRadius="14dp"
app:cardElevation="8dp"
>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="@dimen/padding18dp"
android:gravity="center_horizontal"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_alignParentTop="true"
android:gravity="center_horizontal"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Connection Not Available !!"
android:textAppearance="@style/CardTextView"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Please Check Your Internet Connection And Try Again"
android:textAppearance="@style/CardTextViewSmall"
android:layout_margin="@dimen/margin3dp"
/>
</LinearLayout>
<ImageView
android:layout_width="80dp"
android:layout_height="80dp"
android:src="@drawable/no_connection"
android:layout_centerInParent="true"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/btn_background1"
android:text="Try Again"
android:textAppearance="@style/CardTextView"
android:layout_marginLeft="@dimen/margin38dp"
android:layout_marginRight="@dimen/margin38dp"
android:textAlignment="center"
android:layout_alignParentBottom="true"
android:padding="@dimen/padding5dp"
android:id="@+id/adTryAgain"
/>
</RelativeLayout>
</androidx.cardview.widget.CardView>
我的警报对话框class。
public class AlertDialogClass extends DialogFragment implements View.OnClickListener {
private TextView tryAgainButton ;
private AlertDialogClickInterface clickInterface ;
public AlertDialogClass(AlertDialogClickInterface clickInterface) {
this.clickInterface = clickInterface;
}
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
View layout = getActivity().getLayoutInflater().inflate(R.layout.alert_dialog,null);
tryAgainButton = (TextView)layout.findViewById(R.id.adTryAgain);
tryAgainButton.setOnClickListener(this);
Dialog dialog = new Dialog(getActivity());
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(layout);
return dialog;
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.adTryAgain){
clickInterface.OnAlertButtonClicked();
}
}
public interface AlertDialogClickInterface {
void OnAlertButtonClicked();
}
}
我想显示警报对话框的片段。
try {
if (CheckConnection.isConnected())
getDataFromViewModel();
else {
AlertDialogClass dialogClass = new AlertDialogClass( this);
dialogClass.show(getChildFragmentManager(),dialogClass.getTag());
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
预期的布局应该是这样的:
但实际输出是这样的:
这是我在文本视图中使用的样式
<style name="CardTextView" parent="TextAppearance.AppCompat.Widget.ActionBar.Subtitle" >
<item name="android:textColor">@color/textColorWhite1</item>
<item name="android:textStyle">bold</item>
<item name="android:textSize">@dimen/textSize18</item>
<item name="android:fontFamily">sans-serif-smallcaps</item>
</style>
<style name="CardTextViewSmall" parent="TextAppearance.AppCompat.Widget.ActionBar.Subtitle" >
<item name="android:textColor">@color/textColorWhite2</item>
<item name="android:textStyle">bold</item>
<item name="android:textSize">@dimen/textSize14</item>
<item name="android:fontFamily">sans-serif-smallcaps</item>
</style>
尝试更改自:
Dialog dialog = new Dialog(getActivity());
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(layout);
为此:
Dialog dialog = new Dialog(getActivity());
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
dialog.setContentView(layout);
添加了 1
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
这个用来保持对话框周围的背景透明。
dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
并且这个保持你的对话框高度就像它在 XML 文件中设置的一样。
我正在尝试实现自定义警报生成器,它应该显示我想要使用的自定义布局。我创建了一个名为 "AlertDialogClass" 的 class,它扩展了 DialogFragment。我正在尝试从片段中显示此警报生成器 class。
我在使用 AlertDialogClass 时没有收到任何错误或任何崩溃,但应该显示的布局仅显示白屏。我尝试了很多东西,但似乎没有任何效果。我不明白为什么会这样或者我做错了什么。
这是我的布局文件。
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="230dp"
xmlns:app="http://schemas.android.com/apk/res-auto"
app:cardBackgroundColor="@color/backgroundElevation2dp"
app:cardCornerRadius="14dp"
app:cardElevation="8dp"
>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="@dimen/padding18dp"
android:gravity="center_horizontal"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_alignParentTop="true"
android:gravity="center_horizontal"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Connection Not Available !!"
android:textAppearance="@style/CardTextView"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Please Check Your Internet Connection And Try Again"
android:textAppearance="@style/CardTextViewSmall"
android:layout_margin="@dimen/margin3dp"
/>
</LinearLayout>
<ImageView
android:layout_width="80dp"
android:layout_height="80dp"
android:src="@drawable/no_connection"
android:layout_centerInParent="true"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/btn_background1"
android:text="Try Again"
android:textAppearance="@style/CardTextView"
android:layout_marginLeft="@dimen/margin38dp"
android:layout_marginRight="@dimen/margin38dp"
android:textAlignment="center"
android:layout_alignParentBottom="true"
android:padding="@dimen/padding5dp"
android:id="@+id/adTryAgain"
/>
</RelativeLayout>
</androidx.cardview.widget.CardView>
我的警报对话框class。
public class AlertDialogClass extends DialogFragment implements View.OnClickListener {
private TextView tryAgainButton ;
private AlertDialogClickInterface clickInterface ;
public AlertDialogClass(AlertDialogClickInterface clickInterface) {
this.clickInterface = clickInterface;
}
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
View layout = getActivity().getLayoutInflater().inflate(R.layout.alert_dialog,null);
tryAgainButton = (TextView)layout.findViewById(R.id.adTryAgain);
tryAgainButton.setOnClickListener(this);
Dialog dialog = new Dialog(getActivity());
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(layout);
return dialog;
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.adTryAgain){
clickInterface.OnAlertButtonClicked();
}
}
public interface AlertDialogClickInterface {
void OnAlertButtonClicked();
}
}
我想显示警报对话框的片段。
try {
if (CheckConnection.isConnected())
getDataFromViewModel();
else {
AlertDialogClass dialogClass = new AlertDialogClass( this);
dialogClass.show(getChildFragmentManager(),dialogClass.getTag());
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
预期的布局应该是这样的:
但实际输出是这样的:
这是我在文本视图中使用的样式
<style name="CardTextView" parent="TextAppearance.AppCompat.Widget.ActionBar.Subtitle" >
<item name="android:textColor">@color/textColorWhite1</item>
<item name="android:textStyle">bold</item>
<item name="android:textSize">@dimen/textSize18</item>
<item name="android:fontFamily">sans-serif-smallcaps</item>
</style>
<style name="CardTextViewSmall" parent="TextAppearance.AppCompat.Widget.ActionBar.Subtitle" >
<item name="android:textColor">@color/textColorWhite2</item>
<item name="android:textStyle">bold</item>
<item name="android:textSize">@dimen/textSize14</item>
<item name="android:fontFamily">sans-serif-smallcaps</item>
</style>
尝试更改自:
Dialog dialog = new Dialog(getActivity());
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(layout);
为此:
Dialog dialog = new Dialog(getActivity());
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
dialog.setContentView(layout);
添加了 1
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
这个用来保持对话框周围的背景透明。
dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
并且这个保持你的对话框高度就像它在 XML 文件中设置的一样。