我目前正在尝试在导航抽屉中使用偏好片段。有多个首选项片段可以填充框架布局,所有这些可能具有不同的大小,并且可能不是父级的完整高度。 出于这个原因,我想使用wrap_content作为帧布局高度,但是当优先级片段从ListView扩展时,这会导致问题(引用ListView Wrap Content)。 wrap_content确实提供了所需的结果,虽然我可以看到OnBindView被连续调用,这非常低效并导致我的数据绑定方法一直被调用。
有没有人可以尝试任何简单的解决方案?或者这是自定义视图的情况,我将测量片段的子项并在运行时设置高度?对此有任何帮助将非常感激。
下面的布局显示了主布局中包含的抽屉布局。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:orientation="horizontal"
android:padding="20dp">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<RadioGroup
android:id="@+id/drawer_radio"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RadioButton
android:id="@+id/drawer_radio_button_0"
style="@style/ButtonDrawer"
android:background="@drawable/fft_button"
android:button="@null"
android:contentDescription="@string/image_button"/>
<RadioButton
android:id="@+id/drawer_radio_button_1"
style="@style/ButtonDrawer"
android:background="@drawable/trigger_button"
android:button="@null"
android:contentDescription="@string/image_button"/>
</RadioGroup>
</LinearLayout>
<FrameLayout
android:id="@+id/drawer_preference_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
tools:layout="@android:layout/simple_list_item_1"
android:background="@drawable/floating_preference_background_shape"/>
</LinearLayout>
答案 0 :(得分:0)
好的,所以我认为我找到了一个很好的解决方案,所以我认为我会将其发布给其他人使用。 我必须这样做的方法是从PreferenceFragment扩展并在运行时进行一些测量,我可以使用它来调整listView的大小。
我用以下方法做到了这一点。
public class PreferenceFragmentHeightWrap extends PreferenceFragment {
/**
* We can guarantee that all children will be in the adaptor list by this point
*/
@Override
public void onResume() {
super.onResume();
setListViewHeightBasedOnItems(getView());
}
/**
* Sets ListView height dynamically based on the height of the items.
*
* @return true if the listView is successfully resized, false otherwise
*/
public boolean setListViewHeightBasedOnItems(View view) {
ListView listView = (ListView) view.findViewById(android.R.id.list);
ListAdapter listAdapter = listView.getAdapter();
if(listAdapter != null) {
int numberOfItems = listAdapter.getCount();
// Get total height of all items.
int totalItemsHeight = 0;
for(int itemPos = 0; itemPos < numberOfItems; itemPos++) {
View item = listAdapter.getView(itemPos, null, listView);
item.measure(0, 0);
totalItemsHeight += item.getMeasuredHeight();
}
// Get total height of all item dividers.
int totalDividersHeight = listView.getDividerHeight() *
(numberOfItems - 1);
// Set list height.
ViewGroup.LayoutParams params = view.getLayoutParams();
params.height = totalItemsHeight + totalDividersHeight + listView.getPaddingBottom()
+ listView.getPaddingTop();
view.setLayoutParams(params);
return true;
} else {
return false;
}
}
希望如果你看到任何不幸的事情,这将是有意义的,并随时发表评论。