`

解决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`、`Spinner`和`ListView`是三个非常重要的组件,它们各自承担着不同的功能,并且可以协同工作以提供丰富的用户界面。`TabHost`用于创建多标签界面,`Spinner`则是一种下拉选择菜单,而`...

    详解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) 内存管理,支持选中关闭指定进程

    actionbar的使用

    在ActionBar中使用List模式,通常是指在ActionBar中展示下拉列表(Dropdown List),也称为Spinner。这种方式常用于提供一组相关的选项,用户可以点击下拉箭头来选择。 1. **创建SpinnerAdapter**:首先,你需要...

    android考试复习资料

    LogCat 用于收集应用程序的日志信息,通过在代码中设置日志点(使用 Log.v()、Log.d()、Log.i()、Log.w() 和 Log.e() 函数),然后在 LogCat 中查看这些信息,以便定位和解决问题。DevTools 是一系列用于调试和测试...

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

    这个项目对于初学者来说是很好的学习材料,有助于理解安卓开发的基本概念和技术。...通过学习和分析这个项目,开发者可以深入理解安卓应用的基本架构和工作原理,同时提高在实际开发中解决问题的能力。

    Android应用开发中Action bar编写的入门教程

    例如,通过在菜单布局文件中使用`android:actionLayout`属性指定一个自定义布局,如`SearchView`,并在活动中处理相应的事件。 5. **使用程序图标进行导航** ActionBar左上角的图标通常作为返回主屏幕或向上导航的...

    Android用户界面

    Android提供了丰富的系统控件,如TextView、EditText、Button、ImageButton、Checkbox、RadioButton、Spinner、ListView和TabHost等,这些控件满足了大部分常见的界面需求,同时也支持开发者创建定制控件以满足特殊...

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

    在本案例中,开发者可能使用`TabHost`来创建一个标签页,其中一标签用于进制转换,另一标签可能是教学或示例。 6. **Spinner**:是一个下拉列表控件,用户可以点击后看到可选项并选择一个。在进制转换器中,`...

    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实例——...

    目前市面上最全的可以再工作中用到的100个Demo(下)

    然而,现在更推荐使用`TabLayout`结合`ViewPager`,因为`TabHost`在新的Android设计支持库中已被弃用。 6. **获取当前的分辨率Demo**: 这涉及到获取设备的屏幕尺寸,通过`DisplayMetrics`对象可以获取宽度和高度...

    android实例大全

    在这个实例中,你会看到如何配置TabHost,设置各个标签页的内容,并实现标签之间的交互。 4. **GridAndImageSwitcherSample**: GridAndImageSwitcher涉及到了GridView和ImageSwitcher两个组件。GridView是一个可...

    Android开发教程之Android控件--千锋培训

    1. **ZoomControls**:这是一个用于缩放视图的控件,通常在地图应用中使用。它包含两个按钮,一个用于放大,另一个用于缩小。在XML布局文件中,可以通过`&lt;ZoomControls&gt;`标签添加,如代码所示。在Java代码中,可以...

    Android ActionBar Demo

    可以使用Theme.AppCompat的子主题(如`Theme.AppCompat.Light.NoActionBar`)或在XML布局中使用`&lt;androidx.drawerlayout.widget.DrawerLayout&gt;`来动态隐藏或显示ActionBar。 总之,"Android ActionBar Demo"将向...

    Android 3.0新增UI控件示例说明.rar

    在Activity中使用`FragmentManager`进行添加、删除或替换Fragment的操作。 3. **PopupWindow** - **定义**:PopupWindow是Android 3.0中提供的一种轻量级窗口,可以在主界面之上弹出一个临时视图。 - **功能**:...

    Android应用源码之HoloEverywhere-master_master.zip

    同时,HoloEverywhere还使用了NineOldAndroids库来支持动画效果,确保在API 8及以下版本也能正常工作。 3. **主要功能特性** - **主题兼容性**:支持从Android 2.1开始的所有版本,提供一致的Holo界面。 - **组件...

    Android_控件运用

    TabHost 是用于创建带有标签页界面的组件,可以组合多个小部件(如 FrameLayout)到一个视图中,并通过标签在它们之间切换。这对于组织复杂界面和多面板交互非常有用。 3. **Android 控件之 Spinner** Spinner ...

    Android 中常见控件参考手册-中文版

    - 使用:用于获取用户输入信息,通常在表单中使用。 3. **Button按钮**: - Button是用户交互中的基本控件,用于触发事件。 - 类的结构:继承自View类。 - 方法:如设置点击事件监听器。 - 属性:用于定义按钮...

Global site tag (gtag.js) - Google Analytics