从PopWindow显示ListPopupWindow

问题描述 投票:1回答:1

我有一个带按钮的PopupWindow。在我单击按钮上,我想显示一个ListPopupWindow,但是我得到

FATAL EXCEPTION: main
android.view.WindowManager$BadTokenException: Unable to add window -- token android.view.ViewRootImpl$W@439c79f0 is not valid; is your activity running?

这是我的show()方法,称为onClick()。我在最后一行得到错误

popup.show();

完整:

void showList(View view){

    final ListPopupWindow popup = new ListPopupWindow(this);
    popup.setAdapter(new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, Category));
    popup.setAnchorView(view);
    popup.setWidth(ListPopupWindow.WRAP_CONTENT);
    popup.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                                int position, long id) {
            tvCategory.setText(Category[position]);
            popup.dismiss();
        }
    });

    popup.show();


}

FulllActivity代码:


    public class MapSights extends Activity implements OnMapReadyCallback {

    ImageView btnPlus, close_add_sight;
    PopupWindow pw, add_sg;
    PopupMenu popupMenuCategory;
    ListPopupWindow listPopupWindow;
    int ONE = 1;
    TextView tvCategory;
    LinearLayout add_sight_btn;
    Context context;
    String TAG = "MapSights.java";

    private static final String[] Category = { "Amphibian",
            "Fish", "Reptile", "Bird","Mammal",
            "Miriapode", "Insect", "Arachnid","Shellfish",
            "Snail", "Shell", "Slime mold","Fungi",
            "Plant", "Anemone", "Coral"};


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

        Log.d(TAG, "onCreate");


        context = getApplicationContext();

        MapFragment mapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

        LayoutInflater inflater = (LayoutInflater) MapSights.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View pView = inflater.inflate(R.layout.maplusbtnadds, null, false);
        View pViewSight = inflater.inflate(R.layout.add_sighting, null, false);
        tvCategory = (TextView) pViewSight.findViewById(R.id.txt_category);


        pw = new PopupWindow(pView, 450, 650, false);
        add_sg = new PopupWindow(pViewSight, 450, 650, false);


        btnPlus = (ImageView) findViewById(R.id.plusBtn);
        close_add_sight = (ImageView) pView.findViewById(R.id.close_plus);

        btnPlus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                pw.showAtLocation(MapSights.this.findViewById(R.id.map), Gravity.BOTTOM | Gravity.RIGHT, 0, 0);
            }
        });

        close_add_sight.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                pw.dismiss();
            }
        });

        add_sight_btn = (LinearLayout) pView.findViewById(R.id.add_sight_btn);
        add_sight_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                add_sg.showAtLocation(MapSights.this.findViewById(R.id.map), Gravity.BOTTOM | Gravity.RIGHT, 0, 0);
            }

        });


        tvCategory.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showList(v);
            }
        });

    }


    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG,"onResume");
    }


    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG,"onStart");
    }


    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG,"onStop");
    }


    void showList(View view){

        final ListPopupWindow popup = new ListPopupWindow(this);
        popup.setAdapter(new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, Category));
        popup.setAnchorView(view);
        popup.setWidth(ListPopupWindow.WRAP_CONTENT);
        popup.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                                    int position, long id) {
                Toast.makeText(MapSights.this, "Clicked item " + position, Toast.LENGTH_SHORT).show();
                tvCategory.setText(Category[position]);
                popup.dismiss();
            }
        });

        popup.show();


    }


    @Override
    public void onMapReady(GoogleMap map) {
//        map.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker"));
        map.setMapType(MAP_TYPE_TERRAIN);
    }


}
android popupwindow
1个回答
0
投票

更改final ListPopupWindow popup = new ListPopupWindow(this);final ListPopupWindow popup = new ListPopupWindow(MapSights.this);

尝试在调用popup.show();之前检查活动是否完成以避免错误您的活动是否在运行?

if(!isFinishing()) {
    popup.show();
}
© www.soinside.com 2019 - 2024. All rights reserved.