Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 将按钮放在ListView下方以填充所有可用空间,但按钮应具有最小高度_Android - Fatal编程技术网

Android 将按钮放在ListView下方以填充所有可用空间,但按钮应具有最小高度

Android 将按钮放在ListView下方以填充所有可用空间,但按钮应具有最小高度,android,Android,如何将按钮放置在ListView下方,以遵循以下条件: 按钮应填充ListView下面的所有可用空间 如果ListView内容太大,按钮应出现在ListVew下方的底部,并且应滚动ListView 我同意使用xml布局似乎不可能实现这样的布局。 您可以尝试动态地执行此操作 就像一个概念的证明。 创建主题为的测试应用程序: 创建活动布局activity\u main.xml如下所示: <?xml version="1.0" encoding="utf-8"?> <Relat

如何将按钮放置在ListView下方,以遵循以下条件:

  • 按钮应填充ListView下面的所有可用空间
  • 如果ListView内容太大,按钮应出现在ListVew下方的底部,并且应滚动ListView

我同意使用xml布局似乎不可能实现这样的布局。
您可以尝试动态地执行此操作

就像一个概念的证明。 创建主题为的测试应用程序:

创建活动布局
activity\u main.xml
如下所示:

<?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="match_parent"
                android:id="@+id/root"
    >

    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_above="@+id/button"
        android:layout_alignParentTop="true"/>

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentBottom="true"
        android:text="Button"/>

</RelativeLayout>

在活动中做以下事情:

public class MainActivity extends Activity {

    private Button mButton;
    private ListView mListView;

    private static final int BUTTON_MIN_HEIGHT = 300;

    private ArrayAdapter<String> mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        final List<String> values = new ArrayList<String>();
        mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1, values);

        mListView = (ListView) findViewById(R.id.listView);
        mListView.setAdapter(mAdapter);

        mButton = (Button) findViewById(R.id.button);
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                values.add("Something");

                invalidateViews();
            }
        });


    }

    private int getScreenHeight() {
        Display display = getWindowManager().getDefaultDisplay();
        Point size = new Point();
        display.getSize(size);
        return size.y;
    }

    private int getListViewHeight() {
        int listviewElementsHeight = 0;
        for (int i = 0; i < mAdapter.getCount(); i++) {
            View mView = mAdapter.getView(i, null, mListView);
            mView.measure(
                    View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
                    View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
            listviewElementsHeight += mView.getMeasuredHeight();
        }
        return listviewElementsHeight;
    }

    private void invalidateViews() {
        mAdapter.notifyDataSetChanged();

        int buttonHeight = getScreenHeight() - getListViewHeight();
        Log.e(MainActivity.class.getSimpleName(), "Button height: " + buttonHeight);
        if (buttonHeight < BUTTON_MIN_HEIGHT) {
            buttonHeight = BUTTON_MIN_HEIGHT;
        }
        RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) mButton.getLayoutParams();
        layoutParams.height = buttonHeight;
        mButton.setLayoutParams(layoutParams);
    }
}
公共类MainActivity扩展活动{
私人按钮;
私有列表视图;
专用静态最终整型按钮\最小\高度=300;
私人ArrayaAdapter mAdapter;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
最终列表值=新的ArrayList();
mAdapter=newarrayadapter(这个,android.R.layout.simple_list_item_1,android.R.id.text1,值);
mListView=(ListView)findViewById(R.id.ListView);
mListView.setAdapter(mAdapter);
mButton=(按钮)findviewbyd(R.id.Button);
mButton.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
添加(“某物”);
失效视图();
}
});
}
private int getScreenHeight(){
Display Display=getWindowManager().getDefaultDisplay();
点大小=新点();
display.getSize(size);
返回大小.y;
}
private int getListViewHeight(){
int listviewElementsHeight=0;
对于(int i=0;i
在这个例子中,我们在开始时有一个全屏按钮和一个空列表视图。 单击按钮时,列表视图中将再添加一个项目,按钮大小将重新计算并应用正确的值。 有一些方法可以帮助我们计算所需的按钮高度。 我们提供
BUTTON\u MIN\u HEIGHT
常量来定义按钮的最小高度。 按钮高度我们只需从屏幕高度减去listview的高度即可计算

这个例子很可怕,没有得到优化。问题:

  • 计算列表视图的高度非常长。如果您知道列表视图元素的确切高度,并且知道列表视图包含的项目只有此高度,则可以计算项目的高度一次,然后将项目的高度乘以项目数来计算列表视图的高度
  • 基本上你还需要减去状态栏高度和动作栏高度,如果你有它们的话(为了简单起见,在这个例子中我使用了NoActionBar.Fullscreen主题)
  • 您需要在
    dimens.xml
    文件中定义最小按钮高度,并加载其值
    onCreate
    。在本例中,为了简单起见,我使用常量值
正如你所看到的,这不是一个很好的解决方案,但我希望它能有所帮助

参考文献:



你可以发布一些图片,看看它是什么样子,或者发布你的代码,不管你尝试了什么。只是添加了一些插图。我认为你不能用简单的方法来做到这一点。因为ListView高度!=ListView内容高度。因此ListView不能具有wrap_内容高度(在本例中,它将始终为0)。因此,如果您想这样做smth,您需要添加大量代码,这些代码将在绘制前计算listView的内容高度,并以编程方式更改高度。任何建议都将受到欢迎,谢谢。如果列表视图项的高度可变怎么办?我认为在这种情况下,您必须将列表视图的高度计算为每个列表视图项高度的总和。。。