2016-03-05 3 views
9

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

    } 
} 

Antwort

0

Sie nicht onCreateView und onCreateDialog zugleich umsetzen sollen (onCreateDialog durch BottomSheetDialogFragment implementiert).

Stattdessen versuchen dies zu tun:

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

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

+0

Die Superklasse implementiert onCreateDialog –

+0

Wie Sie in der offiziellen Dokumentation sehen können, gibt es kein Problem mit beiden tho. – CounterFlame