2016-06-16 17 views
4

Ich versuche, einen unteren Blatt-Dialog in meiner App auf Knopfdruck zu zeigen. Aber der Dialog öffnet sich teilweise. Ich möchte den Dialog beim Klick auf die Schaltfläche vollständig öffnen.Android Bottom Sheet Modal (Dialog) öffnet sich nicht vollständig

Ich habe folgenden Code versucht.

MainActivity.java

public class MainActivity extends AppCompatActivity { 

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

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    View showModalBottomSheet = findViewById(R.id.as_modal); 
    showModalBottomSheet.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      //Initializing a bottom sheet 
      BottomSheetDialogFragment bottomSheetDialogFragment = new CustomBottomSheetDialogFragment(); 

      //show it 
      bottomSheetDialogFragment.show(getSupportFragmentManager(), bottomSheetDialogFragment.getTag()); 
     } 
    }); 
} 
} 

CustomBottomSheetDialogFragment.java

public class CustomBottomSheetDialogFragment extends BottomSheetDialogFragment { 


@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
} 

private BottomSheetBehavior.BottomSheetCallback mBottomSheetBehaviorCallback = new BottomSheetBehavior.BottomSheetCallback() { 

    @Override 
    public void onStateChanged(@NonNull View bottomSheet, int newState) { 
     if (newState == BottomSheetBehavior.STATE_HIDDEN) { 
      dismiss(); 
     } 
    } 

    @Override 
    public void onSlide(@NonNull View bottomSheet, float slideOffset) { 
    } 
}; 

@Override 
public void setupDialog(Dialog dialog, int style) { 
    super.setupDialog(dialog, style); 
    View contentView = View.inflate(getContext(), R.layout.dialog_modal, null); 
    dialog.setContentView(contentView); 
    CoordinatorLayout.LayoutParams layoutParams = 
      (CoordinatorLayout.LayoutParams) ((View) contentView.getParent()).getLayoutParams(); 
    CoordinatorLayout.Behavior behavior = layoutParams.getBehavior(); 
    if (behavior != null && behavior instanceof BottomSheetBehavior) { 
     ((BottomSheetBehavior) behavior).setBottomSheetCallback(mBottomSheetBehaviorCallback); 
    } 
} 
} 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<android.support.design.widget.AppBarLayout 
    android:id="@+id/app_bar" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:theme="@style/AppTheme.AppBarOverlay"> 

    <android.support.v7.widget.Toolbar 
     android:id="@+id/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="?attr/actionBarSize" 
     android:background="?attr/colorPrimary" 
     app:popupTheme="@style/AppTheme.PopupOverlay" /> 

</android.support.design.widget.AppBarLayout> 

<android.support.v4.widget.NestedScrollView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior"> 

    <Button 
     android:id="@+id/as_modal" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_margin="@dimen/activity_horizontal_margin" 
     android:text="@string/modal" /> 

</android.support.v4.widget.NestedScrollView> 

Hier können Sie den Link zum Projekt finden:

Github Project Link

Aktuelles Verhalten:

Screenshot For Current Behaviour

Antwort

1

Die BottomSheetDialogFragment und BottomSheetDialog in Android Support Library Vesion 23.2.0 hatte einige Probleme.

Sie können dies überprüfen doc in Android Support Library, Revision 23.2.1 (März 2016) Abschnitt.

Also, die Lösung ist Ihre com.android.support:design Version auf über 23.2.0 zu aktualisieren. (23.2.1,23.3.0,23.4.0 unabhängig von der neuen Version).

Ich habe Ihren Code in der neuen Version getestet. Es hat normal funktioniert.

Ich hoffe, es hilft.

+0

Dank John lösen. Es funktionierte jetzt wie ein Zauber. –

+0

@ ShubhamBansal OK. Bitte akzeptiere meine Antwort, um anderen zu helfen. :) – JohnWatsonDev

+0

Danke! Dies muss die akzeptierte Antwort sein. – YashikaK

1

Verwenden Sie keine Fragment-Verwendung BottomSheetDialog. Beispiel Demo hochgeladen https://github.com/bita147/BottomSheetDialog

Für Modell Dialog setzen nur

bottomshetDialod.setCanceledOnTouchOutside(false); 

Arbeiten für mich.

0

sollten Sie peekHeight für Sie Verhalten

+1

wahrscheinlich einige Ausarbeitung der Antwort wird geschätzt – YakovL

+1

zum Beispiel: 'bottomSheetBehavior.setPeekHeight (Größe);' –

0

Die gleiche Sache eingestellt war mit mir passiert. Der seltsame Grund dafür war Toolbar Wenn Sie die Symbolleiste entfernen, wird die Unterfolie im Vollbildmodus angezeigt.

Ich weiß nicht den Grund dafür. Aber nach dem Entfernen der Toolbar funktionierte es gut. Sie können das versuchen.

1

An diesen Zeilen in dem setUpDialog Verfahren kann das Problem

BottomSheetDialog d = (BottomSheetDialog) dialog; 
FrameLayout bottomSheet = (FrameLayout) d.findViewById(android.support.design.R.id.design_bottom_sheet); 
BottomSheetBehavior.from(bottomSheet).setState(BottomSheetBehavior.STATE_EXPANDED); 
+0

Ich bin mir nicht sicher, warum es so funktioniert, aber ich denke, es ist besser, es auf STATE_COLLAPSED zu zeigen. –