解决Spinner不能在Tabhost中使用
2918 点击·0 回帖
![]() | ![]() | |
![]() | 本想昨天晚上写这篇文章,但是我学校的网络真的太不给力了呢!竟然无法打开这个页面啊!!! 述说正文吧: 程序背景:使用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); //定义对话框www.atcpu.com 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 方法总比问题多,要静下心去慢慢解决,既然选择这行,就要去坚持下去。 | |
![]() | ![]() |