0

我有一个 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" />

如果你一直坚持到现在阅读这个问题,我已经很感激了。

这是最终结果(我的应用程序的其余部分在后台): 我无法弄清楚为什么对话框没有包装文本。

4

3 回答 3

1

我意识到这本质上是一个封闭的问题,但我相信通过在这个答案https://stackoverflow.com/a/8876358中看到的主题中将 windowIsFloating 设置为 true,您的问题将得到解决。

于 2013-06-21T23:53:46.667 回答
0

我终于能够让它工作..我将 Listview 子类化并改变了它的测量方式。似乎列表视图本身只会测量第一个孩子。所以它使用第一个孩子的宽度。我将其更改为在列表视图子项中搜索最宽的行。

因此对话框内容的 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;
 }
}
于 2014-06-21T01:45:12.997 回答
0

我很确定这是因为android:theme="@android:style/Theme.Dialog",那些讨厌的对话框有自己的宽度和高度。

请尝试以下操作:创建一个Fragment代表您ListActivityListview. 将它放在您的其他 Fragments 上会创建类似对话框的行为。

我 100% 确定问题出在 Theme.Dialog 上。你最好的办法是改变你显示该列表的策略。(例如使用片段)

于 2012-12-21T00:15:07.890 回答