2016-03-05 14 views
9

AppCompatサポートライブラリのv23.2リリースでは、BottomSheetDialogFragmentを使用することに決めました。私は、リストビュー内のアイテムをクリックすると(アダプタでフックされているので、カーソルを表しています)、一番下のシートを開こうとしています。クリックすると、カーソルのIDをDialogFragmentに渡し、コンテンツプロバイダをクエリーして一番下のシートに記入します。BottomSheetDialogFragment - コンテンツをラップして完全に表示する方法

これはすべて問題なく動作しているようですが、下のシートが開くと、一番上のTextViewが表示され、下のシートに渡される完全なレイアウトは表示されます。

は、ここで私が今持っているものです。

1)リストビューを含むフラグメントでは、底面シートダイアログ開くために:

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)

<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> 
をfragment_person_bottom_sheet.xml

基本的に私は最初のTextViewを見るだけで残りの部分を見ることができるようになりました。あなたが同時にonCreateViewonCreateDialogを実装するべきではありません(の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

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

が、私は両方を実装しようとしています。 onCreateViewを使用している理由:DialogFragmentのドキュメントにあるように、特定のケース(http://developer.android.com/reference/android/app/DialogFragment)でも埋め込みフラグメントとしてコンテンツを使用できます。 html#DialogOrEmbed)。 これはどのように私が遭遇した実際の問題に対処していません。 – CounterFlame

+0

スーパークラスはonCreateDialogを実装しています –

+0

公式のドキュメントで分かるように、両方を使用しても問題ありません。 – CounterFlame

関連する問題