Как я могу скрыть фон, когда отображается Bottomsheet, без использования диалогового окна?

Я знаю, что BottomSheetDialog делает это уже, но мне нужно использовать обычный BottomSheet и поведение, генерируемое из BottomSheetBehavior.from() . Это BottomSheet не тускнеть фон, а также коснуться снаружи не закроет его. Есть ли способ BottomSheet фон, когда отображается BottomSheet ? И, возможно, уклониться от прикосновения. В основном поведение, подобное BottomSheetDialog но я должен использовать BottomSheet BottomSheetBehavior напрямую.

Благодаря!

Solutions Collecting From Web of "Как я могу скрыть фон, когда отображается Bottomsheet, без использования диалогового окна?"

Вы можете использовать этот код 1. MainActivity.xml

 <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/main_content" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true"> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:paddingTop="24dp"> <Button android:id="@+id/button_1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Button 1" android:padding="16dp" android:layout_margin="8dp" android:textColor="@android:color/white" android:background="@android:color/holo_green_dark"/> </LinearLayout> </ScrollView> <View android:visibility="gone" android:id="@+id/bg" android:background="#99000000" android:layout_width="match_parent" android:layout_height="match_parent"/> <android.support.v4.widget.NestedScrollView android:id="@+id/bottom_sheet" android:layout_width="match_parent" android:layout_height="350dp" android:clipToPadding="true" android:background="@android:color/holo_orange_light" app:layout_behavior="android.support.design.widget.BottomSheetBehavior" > <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:text="aefwea" android:padding="16dp" android:textSize="16sp"/> </android.support.v4.widget.NestedScrollView> </android.support.design.widget.CoordinatorLayout> 
  1. MAinActivity.java

     public class MainActivity extends AppCompatActivity implements View.OnClickListener { private static final String TAG = "MainActivity"; private BottomSheetBehavior mBottomSheetBehavior; View bottomSheet; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bottomSheet = findViewById(R.id.bottom_sheet); Button button1 = (Button) findViewById(R.id.button_1); button1.setOnClickListener(this); findViewById(R.id.bg).setOnClickListener(this); mBottomSheetBehavior = BottomSheetBehavior.from(bottomSheet); mBottomSheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() { @Override public void onStateChanged(@NonNull View bottomSheet, int newState) { if (newState == BottomSheetBehavior.STATE_COLLAPSED) findViewById(R.id.bg).setVisibility(View.GONE); } @Override public void onSlide(@NonNull View bottomSheet, float slideOffset) { Log.d(TAG, "onSlide: slideOffset" + slideOffset + ""); findViewById(R.id.bg).setVisibility(View.VISIBLE); findViewById(R.id.bg).setAlpha(slideOffset); } }); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.button_1: { mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED); break; } case R.id.bg: { mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED); break; } } } @Override public boolean dispatchTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { if (mBottomSheetBehavior.getState() == BottomSheetBehavior.STATE_EXPANDED) { Rect outRect = new Rect(); bottomSheet.getGlobalVisibleRect(outRect); if (!outRect.contains((int) event.getRawX(), (int) event.getRawY())) { mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED); return true; } } } return super.dispatchTouchEvent(event); } } 

Вы можете создать собственный фрагмент, который имеет макет (вид bottomSheet), прикрепленный снизу, и сделать фон transparent_black и при касании этого BG удалить этот фрагмент. Пример:

activity_main.xml

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ff2020" android:orientation="vertical" tools:context="com.example.jiffysoftwaresolutions.copypastesampleapp.MainActivity"> <Button android:id="@+id/show" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Show" /> <FrameLayout android:id="@+id/bottom_sheet_fragment_container" android:layout_width="match_parent" android:layout_height="match_parent"></FrameLayout> </RelativeLayout> 

MainActivity.java

 public class MainActivity extends AppCompatActivity { private BottomSheetFragment bottomSheetFragment; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.show).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (bottomSheetFragment == null) { bottomSheetFragment = new BottomSheetFragment(); } getSupportFragmentManager().beginTransaction().add(R.id.bottom_sheet_fragment_container, bottomSheetFragment).addToBackStack(null).commit(); } }); } public void removeBottomSheet() { try { getSupportFragmentManager().beginTransaction().remove(bottomSheetFragment).addToBackStack(null).commit(); } catch (Exception e) { } } } 

BottomSheetFragment.java

 public class BottomSheetFragment extends Fragment { private View rootView; private LayoutInflater layoutInflater; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); layoutInflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { rootView = inflater.inflate(R.layout.bottom_sheet_layout, container, false); rootView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // remove sheet on BG touch ((MainActivity) getActivity()).removeBottomSheet(); } }); return rootView; } } 

bottom_sheet_layout.xml

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#6d000000" android:gravity="bottom"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#fff" android:orientation="vertical" android:padding="5dp"> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Button1" android:textColor="#000" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Button2" android:textColor="#000" /> </LinearLayout> </RelativeLayout> 

Чтобы добавить этот фрагмент с помощью bottom_top / animation, вы можете перейти по этой ссылке: Фрагменты и анимация Android

Вы можете использовать мою концепцию, если хотите, чтобы я использовал в AlertDialog с фоном Blur в центре действия

Мой подход

  1. Сделайте снимок экрана
  2. Программный анимированный снимок экрана / размытия
  3. Получить окно смородины с помощью диалога witch не имеет никакого содержимого
  4. Приложить скриншот с эффектом
  5. Показать реальный вид, который я хотел отобразить

Здесь у меня есть класс для получения изображения фона в виде растрового изображения

 public class AppUtils { public static Bitmap takeScreenShot(Activity activity) { View view = activity.getWindow().getDecorView(); view.setDrawingCacheEnabled(true); view.buildDrawingCache(); Bitmap b1 = view.getDrawingCache(); Rect frame = new Rect(); activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame); int statusBarHeight = frame.top; Display display = activity.getWindowManager().getDefaultDisplay(); Point size = new Point(); display.getSize(size); int width = size.x; int height = size.y; Bitmap b = Bitmap.createBitmap(b1, 0, statusBarHeight, width, height - statusBarHeight); view.destroyDrawingCache(); return b; } } 

Поздравляем, теперь у вас есть темное / тусклое изображение, подобное вашему фону

Тогда ваше требование должно не размываться, как мое, чтобы вы могли передать это растровое изображение ниже метода,

 public static Bitmap changeBitmapContrastBrightness(Bitmap bmp, float contrast, float brightness) { ColorMatrix cm = new ColorMatrix(new float[] { contrast, 0, 0, 0, brightness, 0, contrast, 0, 0, brightness, 0, 0, contrast, 0, brightness, 0, 0, 0, 1, 0 }); Bitmap ret = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), bmp.getConfig()); Canvas canvas = new Canvas(ret); Paint paint = new Paint(); paint.setColorFilter(new ColorMatrixColorFilter(cm)); canvas.drawBitmap(bmp, 0, 0, paint); return ret; } 

Теперь используйте поддельный диалог / диалог с фоном / контентом только для того, чтобы получить окно (проверьте мои вопросы, вы можете это понять)

 Window window = fakeDialogUseToGetWindowForBlurEffect.getWindow(); window.setBackgroundDrawable(draw); // draw is bitmap that you created 

После этого вы можете показать свой реальный вид. В моем случае я показываю предупреждение, которое вы можете отображать независимо от вашего вида и не забыть удалить / уйти с этого предупреждения, когда ваш реальный вид выходит из экрана!

Quick out put : (фон может быть настроен так, как вы хотите, не только тусклый)

Введите описание изображения здесь

Используйте этот стиль и примените к своему диалоговому окну.

PS: этот стиль также отлично работает в Android 6.0, 6.1 и 7.0.

 <style name="MaterialDialogSheet" parent="@android:style/Theme.Dialog"> <item name="android:windowIsTranslucent">true</item> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowContentOverlay">@null</item> <item name="android:windowNoTitle">true</item> <item name="android:backgroundDimEnabled">true</item> <item name="android:windowIsFloating">false</item> <item name="android:windowAnimationStyle">@style/MaterialDialogSheetAnimation</item> </style> <style name="MaterialDialogSheetAnimation"> <item name="android:windowEnterAnimation">@anim/popup_show</item> <item name="android:windowExitAnimation">@anim/popup_hide</item> </style> 

И используйте как:

 final Dialog mBottomSheetDialog = new Dialog(mActivity, R.style.MaterialDialogSheet); 

Благодарю.