BottomSheetDialogFragment – 如何包装内容并完全显示?

所以在AppCompat支持库的v23.2版本中,我决定使用BottomSheetDialogFragment。 我一直试图打开底部表,当我点击一个列表视图中的项目(连接适配器,所以它代表一个游标)。 单击时,我将光标的ID传递给DialogFragment并重新查询内容提供者以填写底部表单。

这一切似乎工作正常,现在的问题是,当底部表打开,我只看到顶部的TextView,而我希望它显示传递到底部工作表的完整布局。

这是我现在拥有的:

1)在包含ListView的片段中,打开底部表单对话框:

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> 

所以基本上我只看到第一个TextView,看到剩下的用户现在必须进一步拖动底部表单。 (即使LinearLayout具有用于高度集的wrap_content。)

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) { } } 

Solutions Collecting From Web of "BottomSheetDialogFragment – 如何包装内容并完全显示?"

您不应该同时实现onCreateViewonCreateDialogonCreateDialogBottomSheetDialogFragment实现)。

而是尝试这样做:

 @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; }