web-dev-qa-db-ja.com

AndroidでSpinnerドロップダウンビューの高さを制限する方法

作成に使用するアプローチを提案してください。

クエリ:私は国/都市リストを追加する必要がある2-スピナービューを作成しているので、インドを選択している場合、ドロップダウンビュー内に50個のアイテムが表示されますが、これに関する問題はページ全体の高さを取得していること。

私が欲しいもの:ドロップダウンビューで10個のアイテムしか見ることができないドロップダウンビューを作成したい場合、他のアイテムはユーザーが表示するたびに表示されますスクロールドロップダウンビュー。


My problem

25
Tushar Pandey

Reflectionを使用できます。

    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...
    }
59
shlee1

Spinnerをサブクラス化し、_Android.widget.PopupWindow_が計算に使用するgetWindowVisibleDisplayFrame(Rect outRect)をオーバーライドすることにより、ドロップダウンビューの位置とサイズに影響を与えることもできます。ドロップダウンビューを表示できる領域を制限するには、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);
}
_
7
Almighty

そのために、コメントセクションで@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
Tushar Pandey
  1. Android:popupBackground="#00000000"をスピナーに追加します
  2. アダプター内
getDropDownView();
parentParams = new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, (int) Utils.convertDpToPx(350));
parentParams.gravity = Gravity.BOTTOM;
parent.setLayoutParams(parentParams);
  1. Android:dropDownVerticalOffset="60dp"を追加してポップアップを移動できます
0
Shimi Uhlman

この素晴らしいライブラリ 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"を使用して高さを設定します

0
Mahmoud Ayman