解决Spinner不能在Tabhost中使用

本文解决了一个关于Android开发中Spinner按钮无法点击的问题,并分享了在不同上下文中使用Spinner的有效方法。

本想昨天晚上写这篇文章,但是我学校的网络真的太不给力了呢!竟然无法打开这个页面啊!!!
述说正文吧:
程序背景:使用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 方法总比问题多,要静下心去慢慢解决,既然选择这行,就要去坚持下去。

 

 

Delphi 12.3 作为一款面向 Windows 平台的集成开发环境,由 Embarcadero Technologies 负责其持续演进。该环境以 Object Pascal 语言为核心,并依托 Visual Component Library(VCL)框架,广泛应用于各类桌面软件、数据库系统及企业级解决方案的开发。在此生态中,Excel4Delphi 作为一个重要的社区开源项目,致力于搭建 Delphi 与 Microsoft Excel 之间的高效桥梁,使开发者能够在自研程序中直接调用 Excel 的文档处理、工作表管理、单元格操作及宏执行等功能。 该项目以库文件与组件包的形式提供,开发者将其集成至 Delphi 工程后,即可通过封装良好的接口实现对 Excel 的编程控制。具体功能涵盖创建与编辑工作簿、格式化单元格、批量导入导出数据,乃至执行内置公式与宏指令等高级操作。这一机制显著降低了在财务分析、报表自动生成、数据整理等场景中实现 Excel 功能集成的技术门槛,使开发者无需深入掌握 COM 编程或 Excel 底层 API 即可完成复杂任务。 使用 Excel4Delphi 需具备基础的 Delphi 编程知识,并对 Excel 对象模型有一定理解。实践中需注意不同 Excel 版本间的兼容性,并严格遵循项目文档进行环境配置与依赖部署。此外,操作过程中应遵循文件访问的最佳实践,例如确保目标文件未被独占锁定,并实施完整的异常处理机制,以防数据损毁或程序意外中断。 该项目的持续维护依赖于 Delphi 开发者社区的集体贡献,通过定期更新以适配新版开发环境与 Office 套件,并修复已发现的问题。对于需要深度融合 Excel 功能的 Delphi 应用而言,Excel4Delphi 提供了经过充分测试的可靠代码基础,使开发团队能更专注于业务逻辑与用户体验的优化,从而提升整体开发效率与软件质量。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
# 【实战教程】Pytest从入门到进阶:基于FastAPI的测试开发全指南 13章体系化教程,从Pytest基础到企业级实战,结合FastAPI落地测试方案,附完整可运行代码与最佳实践! ## 核心内容 覆盖环境搭建、用例编写、Fixture系统、参数化测试、覆盖率分析、插件开发、CI/CD集成等13大核心模块,分入门→进阶→高级三阶段学习路径。每章配套FastAPI实战项目(用户认证、电商API、完整电商系统等),测试用例贴合实际业务,支持本地直接运行。聚焦高频难点:Fixture作用域管理、参数化数据源设计、测试并行执行、异常处理、自定义插件开发、覆盖率优化。落地工程化实践:测试目录规范、用例隔离、日志配置、测试报告可视化、CI/CD自动化集成。 ## 技术栈 FastAPI + Pytest + Pydantic + OAuth2/JWT + RESTful API + 测试覆盖率工具 + CI/CD ## 适用人群 Python开发者、测试工程师、后端开发者、DevOps工程师(零基础可入门,有经验可进阶) ## 学习收获 掌握Pytest全流程用法,能独立设计可维护测试体系,实现高覆盖率测试与报告可视化,开发自定义插件,落地TDD与持续集成流程。 ## 快速上手 1. 进入章节目录安装依赖:`pip install fastapi uvicorn pytest fastapi.testclient` 2. 运行应用:`uvicorn app:app --reload`,访问`http://localhost:8000/docs` 3. 执行测试:`python -m pytest test_app.py -v` 配套完整代码、测试用例与配置文件,助力快速落地实际项目!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值