2016-03-05 7 views
9

तो AppCompat समर्थन लाइब्रेरी के v23.2 रिलीज के साथ, मैंने BottomSheetDialogFragment का उपयोग करने का निर्णय लिया। जब मैं किसी सूचीदृश्य में किसी आइटम पर क्लिक करता हूं (एडाप्टर के साथ झुका हुआ है, तो यह एक कर्सर का प्रतिनिधित्व करता है) मैं नीचे शीट खोलने की कोशिश कर रहा हूं। क्लिक करने पर, मैं कर्सर की आईडी को डायलॉगफ्रैगमेंट में पास करता हूं और सामग्री प्रदाता को नीचे की शीट भरने की आवश्यकता होती है।BottomSheetDialogFragment - सामग्री को लपेटने और पूरी तरह प्रदर्शित करने के लिए कैसे?

यह सब ठीक काम करने लगता है, समस्या अब यह है कि जब नीचे की शीट खुलती है, तो मुझे केवल शीर्ष टेक्स्टव्यू दिखाई देता है, जबकि मैं इसे नीचे की चादर पर पूरा लेआउट प्रदर्शित करना चाहता हूं।

यहाँ मैं अब है:

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> 

तो मूल रूप से मुझे केवल पहले टेक्स्टव्यू दिखाई देता है, बाकी को देखने के लिए उपयोगकर्ता को अब नीचे की शीट को खींचना होगा। (हालांकि 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) { 

    } 
} 

उत्तर

0

आप onCreateView और onCreateDialog एक ही समय में लागू नहीं किया जाना चाहिए (onCreateDialogBottomSheetDialogFragment द्वारा कार्यान्वित किया जाता)।

इसके बजाय ऐसा करने का प्रयास करें:

@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

किसी भी बिंदु पर मैं दोनों को लागू करने की कोशिश कर रहा हूँ। कारण मैं क्रिएटिव्यू पर उपयोग कर रहा हूं: जैसा कि आप डायलॉगफ्रैगमेंट के लिए प्रलेखन में देख सकते हैं, आप अभी भी विशिष्ट मामलों में एम्बेडेड टुकड़े के रूप में सामग्री का उपयोग कर सकते हैं (http://developer.android.com/reference/android/app/DialogFragment। एचटीएमएल # DialogOrEmbed)। न तो मैं देखता हूं कि यह मुझे किस वास्तविक समस्या का सामना करता है। – CounterFlame

+0

सुपरक्लास लागू करता है क्रिएटडिअलॉग –

+0

जैसा कि आप आधिकारिक दस्तावेज में देख सकते हैं, दोनों का उपयोग करने में कोई समस्या नहीं है। – CounterFlame

संबंधित मुद्दे