1

バックグラウンド

スピナーに示されているように、ドロップダウンリスト(ダイアログではなく、ビューの下/上に表示されるリスト)をビューに表示できるようにしようとしています(ここに示すように、API 11から開始)。

このために、actionBarSherlock ライブラリの IcsListPopupWindow.java を使用しています。

問題

アイテムのリストをうまく表示できません:

  1. リストが大きすぎて表示できない場合、リストには (スクロールバーの) サムが表示されません。

  2. アイテムを選択すると、通常の選択効果が得られることもあれば、次に示すように灰色の背景が多くなることがあります。

ここに画像の説明を入力

質問

私は何を間違っていますか?私は IcsListPopupWindow.java のコードを見てきましたが、必要なものとそうでないものを理解して確認するのは非常に困難です。

ここに私のサンプルコードがあります:

public class MainActivity extends Activity {

    private PopupMenuAdapter mAdapter;

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //prepare popup menu:
        final PopupMenuItem[] items = new PopupMenuItem[10];
        for (int i = 0; i < items.length; ++i) 
            items[i] = new PopupMenuItem(android.R.drawable.sym_def_app_icon, R.string.hello_world);
        mAdapter = new PopupMenuAdapter(this, android.R.layout.simple_list_item_1, items);
        final IcsListPopupWindow popupWindow = new IcsListPopupWindow(this, null, R.attr.popupMenuStyle);       popupWindow.setBackgroundDrawable(getResources().getDrawable(R.drawable.abs__menu_dropdown_panel_holo_light));
        popupWindow.setAdapter(mAdapter);
        popupWindow.setModal(true);
        popupWindow.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(final AdapterView<?> arg0, final View arg1, final int arg2, final long arg3) {
                popupWindow.dismiss();
            }
        });
        //upon clicking on a button, show the popup menu :
        findViewById(R.id.button1).setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(final View v) {
                // show popup menu:
                popupWindow.setContentWidth(MainActivity.this.getWindowManager().getDefaultDisplay().getWidth() / 2);
                mAdapter.notifyDataSetChanged(); // if you change anything
                popupWindow.setAnchorView(v);
                popupWindow.show();
            }
        });
    }

    // //////////////////////////////////////////////////////////
    // PopupMenuAdapter //
    // ///////////////////
    private class PopupMenuAdapter extends ArrayAdapter<PopupMenuItem> {

        Context context;
        int layoutResourceId;
        PopupMenuItem data[] = null;

        public PopupMenuAdapter(final Context context, final int layoutResourceId, final PopupMenuItem[] data) {
            super(context, layoutResourceId, data);
            this.layoutResourceId = layoutResourceId;
            this.context = context;
            this.data = data;
        }

        @Override
        public View getView(final int position, final View convertView, final ViewGroup parent) {
            View view = convertView;
            if (view == null) {
                final LayoutInflater inflater = ((Activity) context).getLayoutInflater();
                view = inflater.inflate(layoutResourceId, parent, false);
            }
            final PopupMenuItem pItem = data[position];
            final TextView text = (TextView) view.findViewById(android.R.id.text1);
            text.setText(pItem.textResId);
            text.setCompoundDrawablesWithIntrinsicBounds(pItem.iconResId, 0, 0, 0);
            return view;
        }
    }

    private static class PopupMenuItem {
        public int iconResId;
        public int textResId;

        public PopupMenuItem(final int iconResId, final int textResId) {
            this.iconResId = iconResId;
            this.textResId = textResId;
        }
    }
}

編集: 私は今、HoloEverywhere ライブラリから ListPopupWindow.java ファイルを試しました (また、必要なファイルだけをインポートしました) が、まったく同じ問題を抱えています。


EDIT:2番目の問題(選択効果)については、ルートビューの次の属性を持つ独自のカスタマイズされたlistViewアイテムを使用しました:

android:background="@android:drawable/list_selector_background"

スクロールバーを表示する方法がまだわかりません。私が使用する場合:

mPopup.getListView().setVerticalScrollBarEnabled(true);
mPopup.getListView().setScrollbarFadingEnabled(false);

actionBarSherlock の場合よりも何も起こりませんが、holoEverywhere の場合は NPE を取得します:

07-03 14:28:09.359: E/AndroidRuntime(1869): java.lang.NullPointerException
07-03 14:28:09.359: E/AndroidRuntime(1869):     at android.view.View.onDrawScrollBars(View.java:5976)
07-03 14:28:09.359: E/AndroidRuntime(1869):     at android.view.View.draw(View.java:6939)
07-03 14:28:09.359: E/AndroidRuntime(1869):     at android.widget.AbsListView.draw(AbsListView.java:3030)
07-03 14:28:09.359: E/AndroidRuntime(1869):     at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
07-03 14:28:09.359: E/AndroidRuntime(1869):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
07-03 14:28:09.359: E/AndroidRuntime(1869):     at android.view.View.draw(View.java:6936)
07-03 14:28:09.359: E/AndroidRuntime(1869):     at android.widget.FrameLayout.draw(FrameLayout.java:357)
07-03 14:28:09.359: E/AndroidRuntime(1869):     at android.view.ViewRoot.draw(ViewRoot.java:1529)
07-03 14:28:09.359: E/AndroidRuntime(1869):     at android.view.ViewRoot.performTraversals(ViewRoot.java:1265)
07-03 14:28:09.359: E/AndroidRuntime(1869):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1867)
07-03 14:28:09.359: E/AndroidRuntime(1869):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-03 14:28:09.359: E/AndroidRuntime(1869):     at android.os.Looper.loop(Looper.java:130)
07-03 14:28:09.359: E/AndroidRuntime(1869):     at android.app.ActivityThread.main(ActivityThread.java:3687)
07-03 14:28:09.359: E/AndroidRuntime(1869):     at java.lang.reflect.Method.invokeNative(Native Method)
07-03 14:28:09.359: E/AndroidRuntime(1869):     at java.lang.reflect.Method.invoke(Method.java:507)
07-03 14:28:09.359: E/AndroidRuntime(1869):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
07-03 14:28:09.359: E/AndroidRuntime(1869):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
07-03 14:28:09.359: E/AndroidRuntime(1869):     at dalvik.system.NativeStart.main(Native Method)
4

1 に答える 1

0

HoloEverywhere とうまく連携します:P スクリーンショット

package org.holoeverywhere.dropdowntest;

import org.holoeverywhere.app.Activity;
import org.holoeverywhere.widget.ListPopupWindow;
import org.holoeverywhere.widget.TextView;

import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

public class MainActivity extends Activity implements OnClickListener {
    private final class DummyAdapter extends BaseAdapter {
        @Override
        public int getCount() {
            return 500;
        }

        @Override
        public Object getItem(int position) {
            return position;
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            if (convertView == null) {
                convertView = getLayoutInflater().inflate(R.layout.item, parent, false);
            }
            ((TextView) convertView).setText("I'm dummy item #" + position);
            return convertView;
        }
    }

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

        findViewById(R.id.halfSize).setOnClickListener(this);
        findViewById(R.id.fullSize).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        ListPopupWindow lpw = new ListPopupWindow(this);
        lpw.setAdapter(new DummyAdapter());
        lpw.setAnchorView(v);
        int contentWidth = getResources().getDisplayMetrics().widthPixels;
        if (v.getId() == R.id.halfSize) {
            contentWidth /= 2;
        } else {
            // Hardcoded padding, i know
            contentWidth -= 20;
        }
        lpw.setContentWidth(contentWidth);
        lpw.show();
    }
}
于 2013-07-03T13:34:57.363 に答える