工作,爲我所用的情況下,我希望DialogFragment匹配的項目列表的大小。片段視圖是名爲fragment_sound_picker
的佈局中的RecyclerView。我在RecyclerView周圍添加了一個包裝器RelativeLayout。
我已經用R.attr.listItemPreferredHeight
在一個名爲item_sound_choice
的佈局中設置了單個列表項視圖的高度。
DialogFragment從膨脹的View的RecyclerView中獲取LayoutParams實例,將LayoutParams高度調整爲列表長度的倍數,並將修改的LayoutParams應用於膨脹的父視圖。
結果是DialogFragment完美包裝了選擇的短名單。它包括窗口標題和取消/確定按鈕。
這裏是在DialogFragment設置:
// SoundPicker.java
// extends DialogFragment
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(getActivity().getString(R.string.txt_sound_picker_dialog_title));
LayoutInflater layoutInflater = LayoutInflater.from(getActivity());
View view = layoutInflater.inflate(R.layout.fragment_sound_picker, null);
RecyclerView rv = (RecyclerView) view.findViewById(R.id.rv_sound_list);
rv.setLayoutManager(new LinearLayoutManager(getActivity()));
SoundPickerAdapter soundPickerAdapter = new SoundPickerAdapter(getActivity().getApplicationContext(), this, selectedSound);
List<SoundItem> items = getArguments().getParcelableArrayList(SOUND_ITEMS);
soundPickerAdapter.setSoundItems(items);
soundPickerAdapter.setRecyclerView(rv);
rv.setAdapter(soundPickerAdapter);
// Here's the LayoutParams setup
ViewGroup.LayoutParams layoutParams = rv.getLayoutParams();
layoutParams.width = RelativeLayout.LayoutParams.MATCH_PARENT;
layoutParams.height = getListItemHeight() * (items.size() + 1);
view.setLayoutParams(layoutParams);
builder.setView(view);
builder.setCancelable(true);
builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
// ...
});
builder.setPositiveButton(R.string.txt_ok, new DialogInterface.OnClickListener() {
// ...
});
return builder.create();
}
@Override
public void onResume() {
Window window = getDialog().getWindow();
window.setLayout(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
super.onResume();
}
private int getListItemHeight() {
TypedValue typedValue = new TypedValue();
getActivity().getTheme().resolveAttribute(R.attr.listPreferredItemHeight, typedValue, true);
DisplayMetrics metrics = new android.util.DisplayMetrics(); getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);
return (int) typedValue.getDimension(metrics);
}
這是fragment_sound_picker
:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_sound_list"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</RelativeLayout>
尺寸和對話框的位置需要在Dialog構造函數中設置。您必須重寫DialogFragment的onCreateDialog以及您必須創建自定義對話框的位置。 – 2013-02-19 00:15:24
+ Sudar Nimalan謝謝,這是解決方案的一部分。 – Teovald 2013-02-22 16:46:58
對於將來的讀者,相關問題: 1)[設置DialogFragment的大小(寬度和高度)](http://stackoverflow.com/questions/12478520/how-to-set-dialogfragments-width-and-height) 2)[Positioning DialogFragment](http://stackoverflow.com/questions/9698410/position-of-dialogfragment-in-android) – Jonik 2014-02-26 20:20:33