`

解决Spinner不能在Tabhost中使用

阅读更多

本想昨天晚上写这篇文章,但是我学校的网络真的太不给力了呢!竟然无法打开这个页面啊!!!
述说正文吧:
程序背景:使用TabHost,需要在子界面中添加Spinner按钮。
问题:Spinner按钮不能点击,点击出现unable to add window...is your activity running?的错误。
探索:
    由于点击Spinner之后,会弹出一个dropdown item的选项卡,我认为unable to add window应该是这个选项卡没有可以添加上去的activity。从错误的最后一句也能看出程序认为它需要的那个activity并没有在运行。那 Spinner究竟需要哪个activity?哪个activity是当前在运行的?
    思前想后,没有想明白。在网上找了些资料,有一个博客上是这么说 AlertDialog.Builder(xxx.this) => AlertDialog.Builder(this.getParent()) 。我按照这个来试了一下,不加this.getParent()会出现上面的错误,加了就没问题。由此可见当前activity应该是tabhost,而不是每个tab对应的activity。
    问题又来了,我应该在哪里给Spinner把当前的activity改成this.getParent()?我在程序里是用了 (Spinner)findViewById(...)的。一个简单的方法就是直接用new Spinner(Context context, AttributeSet attributeSet),这里的context用this.getParent()应该行。不过我这人比较懒,不喜欢用AttributeSet,界面的全放到layout里面。
    又纠结了一个晚上,看来网上有人说不能用setContentView(R.layout...)。一下子就醒悟过来,肯定是这个家伙在搞鬼,是它生成Spinner的。于是把代码改成下面这样子:
  View contentView = LayoutInflater.from(this.getParent()).inflate(R.layout.search_activity, null);
  //setContentView(R.layout.search_activity);
  setContentView(contentView);
    现在问题终于解决了...我只能说不去看一下android的底层实现代码就不能避免这样的囧况(这问题可是困扰了我很久,之前实在搞不定就绕了过去)。


以上红色代码是我在网上找的资料;
按照上面提及的方法我也试了一遍,如果你的程序中Spinner不是放在Dialog中,那个你可以是使用
View contentView = LayoutInflater.from(this.getParent()).inflate(R.layout.search_activity, null);
  //setContentView(R.layout.search_activity);
  setContentView(contentView);

方法来解决如图1,没有任何问题的。

但是我现在想在Dialog中使用Spinner,按照上面的做法不好用。也许是我了解的不够深入吧。

那个时候我想能不能是android layout XML布局文件的问题,如果我用java代码写一个Dialog对话框(包括:Spinner和EditText组件)。

代码如下:

    RelativeLayout myCityRelativeLayout=null;
        TextView myProvinceTextView=null;
        Spinner myProvinceSpinner=null;
        ArrayAdapter<String> myProvinceArrayAdapter=null;
        ArrayList<String> provinces=null;
        RelativeLayout.LayoutParams myProvinceTextViewLP=null;
        Cursor cursor=null;
        final Spinner spinner=null;
       
        switch (item.getItemId()) {
        case MENU_ADD:
           
             myCityRelativeLayout= new RelativeLayout(CityManagerActivity.this);
            //设置相对布局宽度和高度
            myCityRelativeLayout.setLayoutParams(new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT));
            //设置相对布局中组件为向左对齐
            myCityRelativeLayout.setGravity(Gravity.LEFT);
           
            //定义TextView对象myProvinceTextView、编号为1、内容为省份
            myProvinceTextView=new TextView(CityManagerActivity.this);
            myProvinceTextView.setId(1);
            myProvinceTextView.setText(R.string.province);
            //定义myProvinceTextViewLP对象,布局:为顶部布局、跟父类左侧对齐,距左边10px
             myProvinceTextViewLP= new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
            myProvinceTextViewLP.addRule(RelativeLayout.ALIGN_PARENT_TOP);
            myProvinceTextViewLP.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);
            myProvinceTextViewLP.setMargins(10, 0, 10, 0);
            myCityRelativeLayout.addView(myProvinceTextView,myProvinceTextViewLP);
       
            //定义myProvinceSpinner对象、编号为2
             myProvinceSpinner = new Spinner(CityManagerActivity.this);
           
            cursor=DBHelper.getInstance(CityManagerActivity.this).selectProvince();
            myProvinceArrayAdapter= new ArrayAdapter<String>(CityManagerActivity.this, android.R.layout.simple_spinner_item);
            myProvinceArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
           
            while(cursor.moveToNext())
            {
                System.out.println(cursor.getString(1));
                myProvinceArrayAdapter.add(cursor.getString(1));
            }
           
           
            myProvinceSpinner.setAdapter(myProvinceArrayAdapter);
            myProvinceSpinner.setId(2);
            provinceName=myProvinceSpinner.getSelectedItem().toString();
            //System.out.println(provinceName);
            myProvinceSpinner.setOnItemSelectedListener(myProvinceSpinnerListener);
            //定义myProvinceSpinnerLP对象,布局:为顶部布局、跟父类左侧对齐、距左边10px、距右边10px
            RelativeLayout.LayoutParams myProvinceSpinnerLP= new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);
            myProvinceSpinnerLP.addRule(RelativeLayout.ALIGN_PARENT_TOP);
            myProvinceSpinnerLP.addRule(RelativeLayout.RIGHT_OF,myProvinceTextView.getId());
            myProvinceSpinnerLP.setMargins(10, 0, 10, 0);
            myCityRelativeLayout.addView(myProvinceSpinner,myProvinceSpinnerLP);
       
            //定义myCityTextView对象,编号:3、内容:城市
            TextView myCityTextView =new TextView(CityManagerActivity.this);
            myCityTextView.setText(R.string.city);
            myCityTextView.setId(3);
            //定义myCityTextViewLP对象,布局:左边跟myProvinceTextView组件对齐、在myProvinceTextView组件下方、距左边10px、距右边10px
            RelativeLayout.LayoutParams myCityTextViewLP= new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
            myCityTextViewLP.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);
            myCityTextViewLP.addRule(RelativeLayout.BELOW,myProvinceSpinner.getId());
            myCityTextViewLP.setMargins(10, 0, 10, 0);
            myCityRelativeLayout.addView(myCityTextView,myCityTextViewLP);
           
            //定义myCityEditText对象,编号:4、内容:点击列表的内容
             final EditText myCityEditText_add=new EditText(CityManagerActivity.this);
           
       
            //定义myCityEditTextLP对象,布局:左边跟myCityTextViewLP组件对齐、在myCityTextViewLP组件下方、距左边10px、距右边10px
            RelativeLayout.LayoutParams myCityEditTextLP= new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);
            myCityEditTextLP.addRule(RelativeLayout.BELOW,myProvinceSpinner.getId());
            myCityEditTextLP.addRule(RelativeLayout.RIGHT_OF,myCityTextView.getId());
            myCityEditTextLP.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE);
            myCityEditTextLP.setMargins(10, 0, 10, 0);
            myCityRelativeLayout.addView(myCityEditText_add,myCityEditTextLP);
           
            //定义对话框
            new AlertDialog.Builder(CityManagerActivity.this)
            .setView(myCityRelativeLayout)
            .setIcon(R.drawable.add)
            .setTitle(R.string.add_city)
            .setPositiveButton(R.string.add, new OnClickListener() {
               
                @Override
                public void onClick(DialogInterface dialog, int which) {
                   
                    String cityName=myCityEditText_add.getText().toString();
                    if(cityName==null||cityName.trim().length()==0)
                    {
                        Toast.makeText(CityManagerActivity.this, "城市不能为空!!!", Toast.LENGTH_LONG);
                    }else{
                        Integer provinceId=null;
                        if(provinceName!=null)
                        {
                            Cursor cursor=DBHelper.getInstance(CityManagerActivity.this).selectProvinceByName(provinceName);
                            while(cursor.moveToNext())
                            {
                                provinceId=cursor.getInt(0);
                               
                            }
                        }
                        Province province= new Province();
                        province.setId(provinceId);
                       
                        City city= new City();
                        city.setName(cityName);
                        city.setProvince(province);
                       
                        DBHelper.getInstance(CityManagerActivity.this).addCity(city);
                       
                    }
                   
                   
                   
                }
            })
            .setNegativeButton(R.string.cancel, null)
            .show();
            break;

当我再次运行这个项目时候,终于达到预期的效果了呢!!!我很高兴!!!

就这个问题已经困扰我好几个小时呢,刚开始我还以为Spinner那部分代码有问题呢,我啊,各种改啊,就是没有解决啊。我竟然都开始怀疑自己的能力呢!!!

从这个问题我体会到:

1:不要太依赖android的布局文件,有时候你可以考虑自己手动编写布局代码;

2:如果有些地方不了解,可以考虑看android Samples实例代码或者看源码;

3:当发现问题,看控制台的异常,然后将关键部分去goolge网上去搜索;

4:Never give up 方法总比问题多,要静下心去慢慢解决,既然选择这行,就要去坚持下去。

 

 

  • 大小: 26.1 KB
  • 大小: 34.1 KB
  • 大小: 24.8 KB
2
0
分享到:
评论

相关推荐

    Android TabHost Spinner ListView 实例代码

    Android TabHost ListView初学者的实例代码

    详解Android应用中使用TabHost组件进行布局的基本方法

    getHost()获取前提 : 设置了该id之后, 在Activity界面可以使用 getHost(), 获取这个TabHost 视图对象; 示例 : 代码如下: &lt;tabhost android:id=”@android:id/tabhost” android:layout_height=”match_parent”

    Android widget入门手册

    Spinner(Spinner)的使用.doc、 Tab与TabHost.pdf、 按钮(Button)的使用.doc、 单选框(RadioButton)的使用.doc、 等级条(RatingBar)的使用.doc、 复选框(CheckBox)的使用.doc、 进度条(ProgressBar)的使用.doc、 可...

    Android综合Demo 仿Win8可拖拽界面 自定义控件 自定义spinner,自定义顶栏和副顶栏,内存管理

    仿Win8可拖拽界面 自定义Spinner、自定义顶栏和副顶栏(包括三个下拉操作) 支持选项卡(使用的是TabHost,比较老的方式,现在已经不提倡了,看看就好,推荐使用fragment) 内存管理,支持选中关闭指定进程

    天气预报本地登录注册.zip

    这是一个安卓的简单天气预报 包含本地的登录注册 使用spinner切换城市 tabhost底部导航 fragment的简单使用等 很适合新手作业

    Android编程入门很简单.(清华出版.王勇).part2

    5.2.12使用下拉列表框——Spinner 5.2.13实例——请选择工作年限 5.2.14实例——动态修改Spinner项 5.2.15 使用进度条——ProgressBar 5.2.16实例——动态修改进度条 5.2.17使用拖动条——SeekBar 5.2.1 8实例——...

    Android编程入门很简单.(清华出版.王勇).part1

    5.2.12使用下拉列表框——Spinner 5.2.13实例——请选择工作年限 5.2.14实例——动态修改Spinner项 5.2.15 使用进度条——ProgressBar 5.2.16实例——动态修改进度条 5.2.17使用拖动条——SeekBar 5.2.1 8实例——...

    老罗android视频开发源码和ppt经典

    6.28 TabHost卡片的使用 6.29 ViewStub惰性装载控件 6.30 ViewPager多页面滑动效果一 6.31 ViewPager多页面滑动效果二 6.32 ListView普通列表控件的使用 6.33 适配器结合ListView控件的使用 七、百度地图实战开发 ...

    一个Android平台的美食网APP客户端源码.rar

     这个例子中涉及到ListView、各个界面UI控件的使用、TabHost、跑马灯字符串、获取经纬度、Spinner内容适配器、气球图片、全屏显示、标题栏跑马灯的实现、捕获和打印异常、从TabActivity上面获取放置Tab的TabHost、...

    疯狂Android讲义源码

     12.3.1 在Android应用中使用  OpenGL ES 454  12.3.2 绘制平面上的多边形 457  12.3.3 旋转 463  12.4 绘制3D图形 465  12.4.1 构建3D图形 465  12.4.2 应用纹理贴图 469  12.5 本章小结 475  第13章 ...

    疯狂Android讲义.part2

    12.3.1 在Android应用中使用 OpenGL ES 454 12.3.2 绘制平面上的多边形 457 12.3.3 旋转 463 12.4 绘制3D图形 465 12.4.1 构建3D图形 465 12.4.2 应用纹理贴图 469 12.5 本章小结 475 第13章 Android的网络应用 476 ...

    疯狂Android讲义.part1

    12.3.1 在Android应用中使用 OpenGL ES 454 12.3.2 绘制平面上的多边形 457 12.3.3 旋转 463 12.4 绘制3D图形 465 12.4.1 构建3D图形 465 12.4.2 应用纹理贴图 469 12.5 本章小结 475 第13章 Android的网络应用 476 ...

    Android实例代码

    Spinner; DatePicker、TimePicker; ProgressBar; SeekBar; RatingBar; TabHost; ScrollView; ListView、ListActivity; ExpandableListView; GridView、ImageSwitcher; Gallery; 2.5、对话框:AlertDialog; ...

    疯狂Android讲义(第2版)源代码 第6章~第9章

    Spinner; DatePicker、TimePicker; ProgressBar; SeekBar; RatingBar; TabHost; ScrollView; ListView、ListActivity; ExpandableListView; GridView、ImageSwitcher; Gallery; 2.5、对话框:AlertDialog; ...

    有Scroll控件进行连接的多个android控件基础运用

    该android源文件包括:AutoCompleteTextView、CheckButton、Clock、DataPicker、TimePicker、EditText、Gallary、ImageButton、ImageView、ListView、ProgressBar、RatingBar、SeekBar、Spinner、TabHost、TextView...

    Android帮助文档及一些资料打包放送

    [Android1_5]标签TabHost图片文字覆盖的问题 - 农民伯伯 - 博客园.mht374.72 KB [Android1_6]动态添加View的问题 - 农民伯伯 - 博客园.mht371.67 KB [Android1_6]继承BaseAdapter为GridView设置数据时设置...

    android高级UI组件

    Adapter和AdapterView Spinner(下拉列表) ListView(列表) GridView(网格) Gallery(画廊) SlidingDrawer(滑动抽屉) AutoCompleteTextView(自动完成) TabHost(分页视图)

    二八十和十六进制android转换器

    此程序是android下开发的二进制,八进制,十进制十六进制转换,另外一个tab可以直接忽略,想学习tabhost spinner的人也可以看一下

Global site tag (gtag.js) - Google Analytics