CounterFlame
CounterFlame

Reputation: 1632

BottomSheetDialogFragment - How to wrap content and completely display?

So with the v23.2 release of the AppCompat support library, I decided to make use of the BottomSheetDialogFragment. I've been trying to open up the bottom sheet when I click on an item in a listview (hooked up with adapter, so it represents a cursor). When clicked, I pass the ID of the cursor to the DialogFragment and requery the content provider to fill in the bottom sheet.

This all seems to work fine, the problem now is that when the bottom sheet opens up, I only see the top TextView, while I'd like it to display the complete layout that is passed to the bottom sheet.

Here's what I have now:

1) In the fragment that contains the ListView, to open up the bottom sheet dialog:

mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            int clickedPersonId = ((Cursor) mListView.getItemAtPosition(position)).getInt(FriendsFragment.COL_PERSONS_ID);
            Log.v("FriendsFragment", "Clicked person with personid = " + clickedPersonId);

            PersonBottomSheetFragment personBSDF = PersonBottomSheetFragment.newInstance(clickedPersonId);
            personBSDF.show(getFragmentManager(), "BOTTOM_SHEET_PERSON");
        }
    });

2) fragment_person_bottom_sheet.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_person_content"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical">

<TextView
    android:id="@+id/fragment_person_username"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:drawableLeft="@drawable/ic_account_circle_white_36"
    android:drawablePadding="10dp"
    android:drawableStart="@drawable/ic_account_circle_white_36"
    android:gravity="center_vertical"
    android:text="Username"
    android:textAllCaps="false"
    android:textSize="18sp" />

<TextView
    android:id="@+id/fragment_person_personname"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:drawableLeft="@drawable/ic_account_circle_white_36"
    android:drawablePadding="10dp"
    android:drawableStart="@drawable/ic_account_circle_white_36"
    android:gravity="center_vertical"
    android:text="Person name"
    android:textAllCaps="false"
    android:textSize="18sp" />

<TextView
    android:id="@+id/fragment_person_dob"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:drawableLeft="@drawable/ic_account_circle_white_36"
    android:drawablePadding="10dp"
    android:drawableStart="@drawable/ic_account_circle_white_36"
    android:gravity="center_vertical"
    android:text="Date of birth"
    android:textAllCaps="false"
    android:textSize="18sp" />

<TextView
    android:id="@+id/fragment_person_location_country"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:drawableLeft="@drawable/ic_account_circle_white_36"
    android:drawablePadding="10dp"
    android:drawableStart="@drawable/ic_account_circle_white_36"
    android:gravity="center_vertical"
    android:text="Country"
    android:textAllCaps="false"
    android:textSize="18sp" />

</LinearLayout>

So basically I only see the first TextView, to see the rest the user now has to drag the bottom sheet further up. (Even though the LinearLayout has wrap_content for height set.)

3) PersonBottomSheetFragment.java

public class PersonBottomSheetFragment extends BottomSheetDialogFragment
    implements LoaderManager.LoaderCallbacks<Cursor> {

    public final int PERSONBOTTOMSHEETFRAGMENT_LOADER = 18567; // TODO


    TextView usernameView;
    TextView personnameView;
    TextView dobView;
    TextView locationCountryView;

    public PersonBottomSheetFragment() {
        ;
    }

    public static PersonBottomSheetFragment newInstance(int personid) {
        PersonBottomSheetFragment frag = new PersonBottomSheetFragment();
        Bundle argsBundle = new Bundle();
        argsBundle.putInt("personid", personid);
        frag.setArguments(argsBundle);
        return frag;
    }

    @Override
    public void setArguments(Bundle args) {
        super.setArguments(args);
    }

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

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_person_bottom_sheet, null);
        usernameView = (TextView) view.findViewById(R.id.fragment_person_username);
        personnameView = (TextView) view.findViewById(R.id.fragment_person_personname);
        dobView = (TextView) view.findViewById(R.id.fragment_person_dob);
        locationCountryView = (TextView) view.findViewById(R.id.fragment_person_location_country);

        getLoaderManager().initLoader(PERSONBOTTOMSHEETFRAGMENT_LOADER, null, this);

        return view;
    }

    @Override
    public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {

        Uri personsWithIDUri = DataContract.PersonsEntry.buildPersonsUri(getArguments().getInt("personid"));

        return new CursorLoader(getActivity(),
                personsWithIDUri,
                UserFragment.PERSONFRAGMENT_COLUMNS,
                null,
                null,
                null);
    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {

        if (data == null || !data.moveToFirst()) {
            // null or empty cursor
            return;
        }

        usernameView.setText(data.getString(UserFragment.COL_PERSONS_USERNAME));
        personnameView.setText(data.getString(UserFragment.COL_PERSONS_PERSONNAME));
        dobView.setText(data.getString(UserFragment.COL_PERSONS_DOB));
        locationCountryView.setText(data.getString(UserFragment.COL_PERSONS_LOCATION_COUNTRY));
    }

    @Override
    public void onLoaderReset(Loader<Cursor> loader) {

    }
}

Upvotes: 19

Views: 10135

Answers (1)

Nicklas A.
Nicklas A.

Reputation: 7061

You shouldn't implement onCreateView and onCreateDialog at the same time (onCreateDialog is implemented by BottomSheetDialogFragment).

Instead try doing this:

@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    BottomSheetDialog dialog = (BottomSheetDialog) super.onCreateDialog(savedInstanceState);
    View view = inflater.inflate(R.layout.fragment_person_bottom_sheet, null);
    usernameView = (TextView) view.findViewById(R.id.fragment_person_username);
    personnameView = (TextView) view.findViewById(R.id.fragment_person_personname);
    dobView = (TextView) view.findViewById(R.id.fragment_person_dob);
    locationCountryView = (TextView) view.findViewById(R.id.fragment_person_location_country);

    getLoaderManager().initLoader(PERSONBOTTOMSHEETFRAGMENT_LOADER, null, this);
    dialog.setContentView(view);
    return dialog;
}

Upvotes: -1

Related Questions