如何在Android中限制Spinner下拉视图的高度

时间:2013-12-15 17:37:15

标签: android android-layout android-spinner

请建议我用来创建它的任何方法。

查询:我正在创建2-Spinner视图,我必须添加国家/城市列表,所以如果我选择印度然后我在下拉视图中获得50个项目,问题这就是它占据整个页面的高度。

我想要什么:我想创建一个下拉视图,用户只能在其中看到10个项目 每当用户滚动下拉视图时,系统会显示其他项目。


My problem

7 个答案:

答案 0 :(得分:55)

您可以使用反射。

    Spinner spinner = (Spinner) findViewById(R.id.spinner);
    try {
        Field popup = Spinner.class.getDeclaredField("mPopup");
        popup.setAccessible(true);

        // Get private mPopup member variable and try cast to ListPopupWindow
        android.widget.ListPopupWindow popupWindow = (android.widget.ListPopupWindow) popup.get(spinner);

        // Set popupWindow height to 500px
        popupWindow.setHeight(500);
    }
    catch (NoClassDefFoundError | ClassCastException | NoSuchFieldException | IllegalAccessException e) {
        // silently fail...
    }

答案 1 :(得分:7)

您还可以通过继承Spinner并覆盖getWindowVisibleDisplayFrame(Rect outRect)用于计算的android.widget.PopupWindow来影响下拉视图的位置和大小。只需设置outRect即可限制可以显示下拉视图的区域。

这种方法当然不适用于所有场景,因为有时候你想放置下拉视图,这样它就不会模糊另一个视图或者只是在实例之外只知道其他一些条件"。

在我的情况下,我需要将FLAG_LAYOUT_NO_LIMITS标记应用于我的活动窗口,导致outRect变大,因此下拉视图的一部分有时隐藏在导航栏后面。为了恢复原始行为,我使用了以下覆盖:

@Override
public void getWindowVisibleDisplayFrame(Rect outRect) {
    WindowManager wm = (WindowManager) getContext.getSystemService(Context.WINDOW_SERVICE);
    Display d = wm.getDefaultDisplay();
    d.getRectSize(outRect);
    outRect.set(outRect.left, <STATUS BAR HEIGHT>, outRect.right, outRect.bottom);
}

答案 2 :(得分:3)

因为我已经根据@theLittleNaruto的建议在评论部分创建了我自己的PopUpWindow。

<强> main.xml中

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"> 

    <Button 
        android:layout_marginTop="80dp"
        android:id="@+id/btn"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:text="Country"
        android:layout_gravity="center_vertical|center_horizontal"/>
</LinearLayout>

<强> popup_example.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="10dip" >

    <ListView 
        android:id="@+id/lstview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />

</LinearLayout>

<强> showpopup_1.java

package com.example.spinnerworking;

import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.TextView;
import android.widget.PopupWindow.OnDismissListener;
import android.widget.Toast;

public class showpopup_1 extends Activity {

    boolean click = true ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);
        final LayoutInflater inflater = (LayoutInflater) this
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        final Button b = (Button) findViewById(R.id.btn);
        final View pview = inflater.inflate(R.layout.popup_example,
                (ViewGroup) findViewById(R.layout.main));
        final PopupWindow pw = new PopupWindow(pview);
        Log.i("hello", "hello") ;

        b.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                if (click) {
                    // if onclick written here, it gives null pointer exception.
                    // if onclick is written here it gives runtime exception.
                    pw.showAtLocation(v, Gravity.CENTER_HORIZONTAL, 0, 0);
                    pw.update(8, 0, 150, 200);
                    String[] array = new String[] { "tushar", "pandey",
                            "almora" };

                    ListView lst = (ListView) pview.findViewById(R.id.lstview);
                    adapterHello adapter = new adapterHello(showpopup_1.this);
                    lst.setAdapter(adapter);
                    lst.setOnItemClickListener(new OnItemClickListener() {
                        @Override
                        public void onItemClick(AdapterView<?> arg0, View arg1,
                                int arg2, long arg3) {
                            Toast.makeText(showpopup_1.this, "pandey",
                                    Toast.LENGTH_SHORT).show();
                        }

                    });
                    click = false ;
                }
                else
                {
                    pw.dismiss();
                    click = true;
                }

            }
        });
    }
}

class adapterHello extends BaseAdapter {
    String array[] = new String[] { "tushar", "pandey", "almora", "hello",
            "tushar", "pandey", "almora", "hello", "tushar", "pandey",
            "almora", "hello" };

    showpopup_1 context;

    public adapterHello(showpopup_1 context) {
        this.context = context;
    }

    public int getCount() {
        // TODO Auto-generated method stub
        return array.length;
    }

    @Override
    public Object getItem(int arg0) {
        // TODO Auto-generated method stub
        return arg0;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        TextView text = new TextView(context);
        text.setHeight(30);
        text.setPadding(10, 8, 0, 0);
        text.setTextColor(Color.BLACK);
        text.setText(array[position]);
        text.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Log.i("clicked", "tushar");
            }
        });
        return text;
    }

}

答案 3 :(得分:1)

从2020年开始,我将使用:Exposed Dropdown Menus,并在AutoCompleteTextView下使用

android:dropDownHeight="300dp"

如果您不知道这是什么全部内容,请开始探索:Menu-DisplayMenu-Documentation

答案 4 :(得分:0)

  1. android:popupBackground="#00000000"添加到Spinner
  2. in Adapter
  3. getDropDownView();
    parentParams = new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, (int) Utils.convertDpToPx(350));
    parentParams.gravity = Gravity.BOTTOM;
    parent.setLayoutParams(parentParams);
    
    1. 您可以通过添加android:dropDownVerticalOffset="60dp"
    2. 来移动弹出窗口

答案 5 :(得分:0)

您可以使用这个很棒的库MaterialSpinner,它将为您完成所有艰苦的工作。

下载: implementation 'com.jaredrummler:material-spinner:1.3.1'

fileName.xml

<com.jaredrummler.materialspinner.MaterialSpinner
android:id="@+id/spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:ms_dropdown_max_height="400dp"/>

使用app:ms_dropdown_max_height="400dp"

设置高度

答案 6 :(得分:0)

我认为问题是Spinner没有滚动。 就我而言: 由于对我的活动窗口使用了FLAG_LAYOUT_NO_LIMITS标志,微调器无法正常工作。为了恢复原始行为,我使用了相同的解决方案

@Override public void getWindowVisibleDisplayFrame(Rect outRect) { WindowManager wm = (WindowManager) getContext.getSystemService(Context.WINDOW_SERVICE); Display d = wm.getDefaultDisplay(); d.getRectSize(outRect); outRect.set(outRect.left, <STATUS BAR HEIGHT>, outRect.right, outRect.bottom); }

如果仍然遇到不滚动微调器项目的问题。 使用最好的材料旋转器,可以自定义旋转器的高度。

在build.gradle文件中插入: 实施'com.jaredrummler:material-spinner:1.3.1'

在您的xml中:

`       <com.jaredrummler.materialspinner.MaterialSpinner
        android:id="@+id/spinner"
        android:layout_width="145dp"
        android:background="@drawable/button_next"
        android:layout_height="wrap_content"
        android:layout_marginLeft="150dp"
        app:ms_text_color="@color/black"
        appms_padding_left="100dp"
        android:layout_marginTop="-40dp"
        app:ms_dropdown_max_height="300dp"
        tools:ignore="MissingConstraints" />`
Java中的

` 最终的MaterialSpinner Spinner =(MaterialSpinner)findViewById(R.id.spinner);