我有一个Theme.Dialog活动,它向用户显示设备列表。活动使用带有动态创建的ArrayAdapter的ListView来显示设备列表。但是出于某种原因,ListView(以及活动本身)没有调整大小以正确包装它的内容。相反,它的作用就好像它的屏幕宽度大约是屏幕的一半(并且这会在具有不同屏幕尺寸的设备上持续存在)。不过,我不能为我的生活找到合适的地方。
任何人都能看到我错过的东西吗? (我试图从以下代码中删除无关的位)
这是我的活动:
public class DeviceListActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Setup the window
setContentView(R.layout.device_list);
// Initialize array adapters
mPairedDevicesArrayAdapter = new ArrayAdapter<String>(this, R.layout.device_name);
// Find and set up the ListView for paired devices
ListView pairedListView = (ListView) findViewById(R.id.paired_devices);
pairedListView.setAdapter(mPairedDevicesArrayAdapter);
//the following doesn't do anything
//getWindow().setLayout(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
mPairedDevicesArrayAdapter.add("asdfasdfa");
}
}
这是device_list.xml:
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ListView
android:id="@id/paired_devices"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:stackFromBottom="true"
android:background="#0000FF"/>
<!-- the colour shows the listview stretching wider than the text it contains -->
</LinearLayout>
以下是我的AndroidManifest.xml的相关部分:
<activity
android:name=".DeviceListActivity"
android:configChanges="keyboardHidden|orientation"
android:label="too wide"
android:theme="@android:style/Theme.Dialog">
</activity>
这是device_name.xml(用于初始化ArrayAdapter:
<?xml version="1.0" encoding="UTF-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="5.0dip"
android:textSize="18.0sp" />
如果你一直坚持阅读这个问题,我已经很感激了。
这是最终结果(我的应用程序的其余部分在后台):
答案 0 :(得分:1)
我意识到这本质上是一个封闭的问题,但我相信通过在主题中将windowIsFloating设置为true,如此答案https://stackoverflow.com/a/8876358所示,您的问题将得到解决。
答案 1 :(得分:0)
我很确定这是因为android:theme="@android:style/Theme.Dialog"
,那些讨厌的对话框有自己的宽度和高度。
请尝试以下操作:创建一个代表Fragment
为ListActivity
的{{1}}。将其放在其他片段上会产生类似对话框的行为。
我100%确定问题是Theme.Dialog。您最好的镜头是改变您显示该列表的策略。 (例如,使用片段)
答案 2 :(得分:0)
我终于能够让这个工作..i子类化Listview并改变它的测量方式。看来listview本身只会衡量第一个孩子。所以它使用第一个孩子的宽度。我将其更改为在listviews中搜索最宽行。
所以对话框内容的xml如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<com.mypackage.myListView
android:id="@+id/lv"
android:layout_width="wrap_content"
android:layout_height="match_parent"
/>
,myListView看起来像这样:
public class MyListView extends ListView{
public MyListView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// TODO Auto-generated method stub
int maxWidth = meathureWidthByChilds() + getPaddingLeft() + getPaddingRight();
super.onMeasure(MeasureSpec.makeMeasureSpec(maxWidth, MeasureSpec.EXACTLY), heightMeasureSpec);
}
public int meathureWidthByChilds() {
int maxWidth = 0;
View view = null;
for (int i = 0; i < getAdapter().getCount(); i++) {
view = getAdapter().getView(i, view, this);
//this measures the view before its rendered with no constraints from parent
view.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
if (view.getMeasuredWidth() > maxWidth){
maxWidth = view.getMeasuredWidth();
}
}
return maxWidth;
}
}