zoukankan      html  css  js  c++  java
  • Android弹窗中的spinner异常解决办法

    弹窗常用AlertDialog来袜,因为AlertDialog可以很方便的添加所要的项。比如确定/取消按钮,自定义的标题栏、自定义的信息布局等。在自定义布局时,比如我们采用LinearLayout来布局,然后再往LinearLayout中添加一些项,比如TextView、EditText等。这些都很容易实现。

    不过,如果添加spinner,可能就会出问题了。找了很久,发现是context引起的。因为spinner在点击展开下拉列表时,需要依赖于窗体,而使用context只是提供了一个上下文,并没有提供窗体,所以会造成错误。下面是已实现的代码:

    package com.sparkle;
    
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.app.AlertDialog.Builder;
    import android.app.Dialog;
    import android.content.Context;
    import android.content.DialogInterface;
    import android.graphics.Color;
    import android.util.Log;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.LinearLayout;
    import android.widget.Spinner;
    import android.widget.SpinnerAdapter;
    import android.widget.TextView;
    
    public class Contury {
    
    	private Activity _activity = null;
    	private Context _context = null;
    	private Spinner _spinner = null;
    
    	public Contury(Activity activity) {
    		_activity = activity;
    		_context = activity;		
    	}
    
    	private LinearLayout GenerateLinearLayout(int orientation) {
    		LinearLayout linearLayout = new LinearLayout(_context);
    		linearLayout.setPadding(16, 16, 16, 16);
    		linearLayout.setOrientation(orientation);
    		return linearLayout;
    	}
    
    	@SuppressWarnings("deprecation")
    	private Spinner GenerateSpinner() {
    		Spinner spinner = new Spinner(_activity);
    		LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
    				LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
    		spinner.setLayoutParams(layoutParams);
    		return spinner;
    	}
    
    	public void Popup() {
    		Builder alertDialogBuilder = new AlertDialog.Builder(_activity);
    		View view = GenerateLayout();
    		alertDialogBuilder.setView(view);
    		alertDialogBuilder.setPositiveButton("OK",
    				new DialogInterface.OnClickListener() {
    					@Override
    					public void onClick(DialogInterface dialog, int which) {
    						Log.e("TEST","OK");
    					}
    				});
    		alertDialogBuilder.setNegativeButton("Cancel", null);
    		Dialog alertDialog = alertDialogBuilder.create();
    		alertDialog.show();
    	}
    
    
    	private View GenerateLayout() {
    		LinearLayout linearLayout = GenerateLinearLayout(LinearLayout.VERTICAL);
    
    		LinearLayout messageLinearLayout = GenerateMessageLayout();
    
    		linearLayout.addView(messageLinearLayout);
    
    		return linearLayout;
    	}
    
    	private LinearLayout GenerateMessageLayout() {
    		LinearLayout linearLayout = GenerateLinearLayout(LinearLayout.HORIZONTAL);
    		_spinner = GenerateSpinner();
    		_spinner.setAdapter(new CityAdapter(_activity));		
    		_spinner.setSelection(0);
    		linearLayout.addView(_spinner);
    		return linearLayout;
    	}	
    
    	private class CityAdapter extends BaseAdapter implements SpinnerAdapter {
    
    		private Context _con=null;
    		private String[] _cities=null;
    		
    		public CityAdapter(Context context)
    		{
    			_con=context;
    			_cities=_con.getResources().getStringArray(
    					R.array.cities);
    		}
    		
            @Override
            public int getCount() {
            	if(_cities==null)
            	{
            		return 0;
            	}
                return _cities.length;
            }
    
            @Override
            public Object getItem(int position) {
            	if(_cities==null||_cities.length<=0)
            	{
            		return null;
            	}
                return _cities[position];
            }
    
            @Override
            public long getItemId(int position) {
                return position;
            }
    
      
    		@Override
    		public View getView(int position, View convertView, ViewGroup parent) {
    			TextView textView=new TextView(_con);
    			textView.setTextColor(Color.BLACK);
    			textView.setTextSize(20);
    			textView.setText(_cities[position]);
    			return textView;
    		}
    
    		
        }
    
    }
    
    注:

    1、spinner和AlertDialog的new需使用activity,使用context将在弹出下拉菜单时造成错误。

    2、_con.getResources().getStringArray(R.array.cities)是加载xml中定义的数组。

    city.xml(位于values文件夹下)

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
    
        <string-array name="cities">
            <item>厦门</item>
            <item>北京</item>
            <item>上海</item>
        </string-array>
    
    </resources>




  • 相关阅读:
    网线接线分类
    MongoDB修改用户密码
    win10计算器和商店英文改中文
    电脑微信双开
    ajax
    get和post的区别
    javascript中各种继承方式的优缺点
    原型
    高阶函数的封装
    深浅拷贝
  • 原文地址:https://www.cnblogs.com/sparkleDai/p/7605006.html
Copyright © 2011-2022 走看看