Mit der Version 23.2 der AppCompat-Unterstützungsbibliothek entschied ich mich, BottomSheetDialogFragment zu verwenden. Ich habe versucht, das untere Blatt zu öffnen, wenn ich auf ein Element in einer Listview klicke (mit Adapter verbunden, so dass es einen Cursor darstellt). Wenn ich darauf klicke, übergebe ich die ID des Cursors an DialogFragment und frage den Inhaltsanbieter erneut, um das untere Blatt auszufüllen.BottomSheetDialogFragment - Wie wird Inhalt umgebrochen und vollständig angezeigt?
Das alles scheint gut zu funktionieren, das Problem ist jetzt, dass wenn das untere Blatt öffnet, ich nur die obere TextView sehe, während ich möchte, dass es das komplette Layout anzeigt, das an das untere Blatt übergeben wird.
Hier ist, was ich habe jetzt:
1) In dem Fragment, das das Listview enthält, das unterste Blatt Dialog zu öffnen:
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>
Im Grunde sehe ich nur das erste TextView, um den Rest zu sehen, muss der Benutzer nun das untere Blatt weiter nach oben ziehen. (Auch wenn das Linearlayout für die Höhen Satz wrap_content hat.)
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) {
}
}
Zu keinem Zeitpunkt habe ich beide umzusetzen versuchen. Der Grund, warum ich onCreateView verwende: Wie Sie in der Dokumentation von DialogFragment sehen können, können Sie den Inhalt immer noch als eingebettetes Fragment in bestimmten Fällen verwenden (http://developer.android.com/reference/android/app/DialogFragment). html # DialogOrEmbed). Ich sehe auch nicht, wie dies das eigentliche Problem angeht, dem ich begegnet bin. – CounterFlame
Die Superklasse implementiert onCreateDialog –
Wie Sie in der offiziellen Dokumentation sehen können, gibt es kein Problem mit beiden tho. – CounterFlame