Android динамически созданный спиннер не прокручивает - PullRequest
0 голосов
/ 02 ноября 2018

Я создал макет динамически и добавил к нему макет с вращением и смахиванием с помощью кода во фрагменте вместо файлов XML.

Все отлично работает, за исключением того, что спиннер не прокручивается.

Методы спиннера onItemSelected работают нормально.

Вот код внутри метода onCreate фрагмента.

Методы canScrollVertically (-1) и canScrollVertically (1) для счетчика возвращают значение false. Существует основной относительный макет, который содержит два элемента. Спиннер, а затем разметка, расположенная под ним. Разметка Swipe содержит gridview.

parentLayout=new RelativeLayout(getContext());
            ViewGroup.LayoutParams lp=new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
            parentLayout.setLayoutParams(lp);

swipeView = new SwipeRefreshLayout(getContext());
            swipeView.setRefreshing(true);

swipeView.addView(gallery);

            mediaFolderSpinner = new Spinner(getContext());
            mediaFolderSpinner.setId(MEDIA_FOLDER_SPINNER_ID);

            spinnerArray = new ArrayList<String>();
            spinnerArray.add("All media");
            selectedFolder = spinnerArray.get(0);
            populateMediaFolders();
            spinnerArrayAdapter = new ArrayAdapter<String>(getContext(), android.R.layout.simple_spinner_dropdown_item, spinnerArray)
            {
                @NonNull
                @Override
                public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
                    /*return super.getView(position, convertView, parent);*/
                    TextView lbl = (TextView) super.getView(position, convertView, parent);
                    lbl.setText(getItem(position));
                    lbl.setWidth(500);
                    lbl.setHeight(75);
                    lbl.setGravity(Gravity.START);
                    int paddingSidePixels = FileUtil.getPixelsFromDp(5);
                    lbl.setPadding(paddingSidePixels, lbl.getPaddingTop(), lbl.getPaddingRight(), lbl.getPaddingBottom());
                    lbl.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.black));
                    lbl.setTextColor(ContextCompat.getColor(getContext(), R.color.white));
                    return lbl;
                }

                @Override
                public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
                    /*return super.getDropDownView(position, convertView, parent);*/
                    TextView lbl = (TextView) super.getView(position, convertView, parent);
                    lbl.setText(getItem(position));
                    lbl.setWidth(500);
                    lbl.setHeight(75);
                    lbl.setGravity(Gravity.START);
                    int paddingSidePixels = FileUtil.getPixelsFromDp(5);
                    lbl.setPadding(paddingSidePixels, lbl.getPaddingTop(), lbl.getPaddingRight(), lbl.getPaddingBottom());
                    lbl.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.black));
                    lbl.setTextColor(ContextCompat.getColor(getContext(), R.color.white));
                    return lbl;
                }
            };
            mediaFolderSpinner.setAdapter(spinnerArrayAdapter);
            mediaFolderSpinner.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.black));



            mediaFolderSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                @Override
                public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                    selectedFolder = spinnerArrayAdapter.getItem(position);
                    galleryAdaptor.createGrid();
                }

                @Override
                public void onNothingSelected(AdapterView<?> parent) {

                }
            });



            parentLayout.addView(mediaFolderSpinner);

            RelativeLayout.LayoutParams rlp = (RelativeLayout.LayoutParams) mediaFolderSpinner.getLayoutParams();
            int marginPixels = FileUtil.getPixelsFromDp(5);
            rlp.setMargins(rlp.leftMargin, marginPixels, rlp.rightMargin, marginPixels);
            mediaFolderSpinner.setLayoutParams(rlp);



            parentLayout.addView(swipeView);

            if(TYPE == TYPE_IMAGE_VIDEO_MAIN) {
                mediaFolderSpinner.setVisibility(View.VISIBLE);

                RelativeLayout.LayoutParams swipeLp = (RelativeLayout.LayoutParams) swipeView.getLayoutParams();
                swipeLp.addRule(RelativeLayout.BELOW, MEDIA_FOLDER_SPINNER_ID);
                swipeView.setLayoutParams(swipeLp);
            }
            else{
                mediaFolderSpinner.setVisibility(View.GONE);
            }

1 Ответ

0 голосов
/ 25 марта 2019
    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(mediaFolderSpinner);

            //int height = 500;   //Default 500px
            int height = RelativeLayout.LayoutParams.WRAP_CONTENT;
            if(CreatorActivity.creator.getmActivity().isPortrait()) {
                DisplayMetrics displayMetrics = new DisplayMetrics();
                getActivity().getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
                height = displayMetrics.heightPixels;
                /*if (Const.NAVBAR_HEIGHT > 0) {
                    height = height - Const.NAVBAR_HEIGHT;
                }*/
            }

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