android - 从 Bottom Sheet 对话框调用警报对话框或另一个 Bottom Sheet 会导致背景闪烁

标签 android bottom-sheet android-bottomsheetdialog

/image/s9aWZ.jpg

有人遇到过这个问题还是我做错了什么

更新:我在 Android 8 和 9 版本上测试了相同的应用程序,它没有出现此故障。因此,这可能特定于 Android 版本 10

编辑:

这是对话框 fragment 类,其中在 itemview 单击时调用警报对话框 -

public class ItemListDialogFragment extends BottomSheetDialogFragment 
{
  private static final String ARG_ITEM_COUNT = "item_count";

  public static ItemListDialogFragment newInstance(int itemCount) 
  {
    final ItemListDialogFragment fragment = 
          new ItemListDialogFragment();

    final Bundle args = new Bundle();
    args.putInt(ARG_ITEM_COUNT, itemCount);

    fragment.setArguments(args);

    return fragment;
  }

  @Nullable
  @Override
  public View onCreateView(
         LayoutInflater inflater, 
         @Nullable ViewGroup container,
         @Nullable Bundle savedInstanceState) 
  {
    return inflater.inflate( 
        R.layout. 
        fragment_item_list_dialog_list_dialog, 
        container, 
        false );
   }

@Override
public void onViewCreated(
  @NonNull View view, 
  @Nullable Bundle savedInstanceState ) 
{
    final RecyclerView recyclerView = 
       (RecyclerView) view;
    recyclerView.setLayoutManager(
      new LinearLayoutManager( getContext() ) );

    recyclerView.setAdapter( 
      new ItemAdapter( getArguments().getInt( ARG_ITEM_COUNT )  ) );

    recyclerView.setOnClickListener( 
      new View.OnClickListener() 
      {
        @Override
        public void onClick(View view) 
        {
          alert();
        }
       } );
}

private class ViewHolder extends RecyclerView.ViewHolder 
{
  final TextView text;

  ViewHolder( 
     LayoutInflater inflater, 
     ViewGroup parent ) 
  {
    // TODO: Customize the item layout
    super(
      inflater.inflate( 
        R.layout.
          fragment_item_list_dialog_list_dialog_item, 
        parent, 
        false ) );

     text = itemView.findViewById(R.id.text);

     itemView.setOnClickListener(
       new View.OnClickListener() 
       {
          @Override
          public void onClick( View view ) 
          {
             alert();
          }
        } );
  }
}

private class ItemAdapter extends RecyclerView.Adapter<ViewHolder> 
{
  private final int mItemCount;
  ItemAdapter( int itemCount ) 
  {
    mItemCount = itemCount;
  }

  @NonNull
  @Override
  public ViewHolder onCreateViewHolder(
    @NonNull ViewGroup parent, 
    int viewType) 
  {
    return new ViewHolder(
      LayoutInflater.from( parent.getContext( ) ), 
      parent );
  }

  @Override
  public void onBindViewHolder( ViewHolder holder, int position ) 
  {
    holder.text.setText( String.valueOf( position ) );
  }

  @Override
  public int getItemCount() 
  {
    return mItemCount;
  }
}

private void alert()
{
  AlertDialog.Builder builder = 
    new AlertDialog.Builder( getActivity() );

  builder.setTitle( "Alert dialog" );
  builder.setMessage( "This is a alert dialog" );
  builder.setPositiveButton(
    "ok", 
    new DialogInterface.OnClickListener() 
    {
      @Override
      public void onClick( DialogInterface dialogInterface, int i ) 
      {
      }
    } );
  builder.setNegativeButton(
    "close", 
    new DialogInterface.OnClickListener() 
    {
      @Override
      public void onClick( DialogInterface dialogInterface, int i ) 
      {
      }
    } );

  builder.show();
} 

这就是 Bottom Sheet 的名称 -

public class MainActivity extends AppCompatActivity 
{

  @Override
  protected void onCreate( Bundle savedInstanceState ) 
  {
    super.onCreate( savedInstanceState );
    setContentView( R.layout.activity_main );

    ItemListDialogFragment.
      newInstance(10).
      show( getSupportFragmentManager(), "df" );
  }
}

最佳答案

我能够通过在设置嵌套对话框的主题时将 android:backgroundDimEnabled 设置为 false 找到解决方法。

<style name="Theme.MyApp.BottomSheetDialog.Nested" parent="@style/Theme.Design.Light.BottomSheetDialog">
        <item name="android:backgroundDimEnabled">false</item>
</style>

在我的onCreateDialog内部:

 val bottomSheet =
        if (isNested()) {
            BottomSheetDialog(
                requireContext(),
                R.style.Theme_MyApp_BottomSheetDialog_Nested
            )
        } else {
            BottomSheetDialog(
                requireContext(),
                R.style.Theme_Design_BottomSheetDialog
            )
        }

将主题传递给 AlertDialog.Builder 时,它的工作原理应该是相同的。

关于android - 从 Bottom Sheet 对话框调用警报对话框或另一个 Bottom Sheet 会导致背景闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60691007/

相关文章:

Android 运行时错误 :Unable to marshal value

android - 如何在 Room 持久性库中使用外键

java - 在应用程序中实现 BottomSheet

android - 使用最新的 WindowInset API 出现软键盘时如何调整对话框布局

android - 向 BottomSheetDialogFragment 添加边距

Android HttpURLConnection 设置 GET 请求方法

java - 在android中设置简单的自定义标签

Android BottomSheet 类似于 Share Sheet,底部有锚定 View

android - BottomSheet 与 RecyclerView 和其他 View

android - 如何在 BottomSheetDialog 上使用 View 绑定(bind)