package com.rivershuang.sipnnertest;import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.Spinner;public class MainActivity extends Activity {

private Spinner test_Spinner = null;
private EditText test_EditText = null;
private String[] test_str = {"A", "B", "C"}; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

test_Spinner = (Spinner) findViewById(R.id.test_spinner);
test_EditText = (EditText) findViewById(R.id.test_edittext);

ArrayAdapter<String> test_Adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, 
test_str);
test_Adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
test_Spinner.setAdapter(test_Adapter);

test_Spinner.setSelection(2);
test_EditText.setText("写入测试");

test_Spinner.setOnItemSelectedListener(new OnItemSelectedListener() { @Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
test_EditText.setText("");
} @Override
public void onNothingSelected(AdapterView<?> parent) {
// TODO Auto-generated method stub

}
});
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}}
test_Spinner.setSelection(2);
test_EditText.setText("写入测试");onItemSelected中执行是当spinner选择变化时,edittext清空
oncreate中执行顺序是(我认为是)
test_Spinner.setSelection(2);...................test_EditText.setText("");.................test_EditText.setText("写入测试");
但结果是清空的
debug后发现,执行顺序为:
test_Spinner.setSelection(2);.................test_EditText.setText("写入测试");...................test_EditText.setText("");
我在我的其他项目遇到了这个问题,现在没法用spinner变化后控制其他控件,现求助android

解决方案 »

  1.   

    嗯哼,一直没注意这个
    如果可以你可以把一部分代码放到onResume里面试试
      

  2.   

    你可以加一个其他的控件,让这个控件先requestfocus,然后再测试你的代码。你的代码顺序就是先test_EditText.setText("写入测试");然后在test_EditText.setText("");
      

  3.   


    麻烦详细一点,谢谢,requestfocus这个用的顺序,可以在我这个代码里面模拟一下吗另,为何我这个spinner控制是先选择了,再设置文本的,却反过来了呢
      

  4.   

    setSelection我记得有个重载方法的setSelection(int, boolean)你试试用setSelection(2, true)或者setSelection(2, false);看看有用没
      

  5.   


    Jump directly to a specific item in the adapter data.
    Parameters:
    position 
    animate这个应该是控制动画的true/false
      

  6.   


    Jump directly to a specific item in the adapter data.
    Parameters:
    position 
    animate这个应该是控制动画的true/false
    恩,默认是有动画的,去掉动画试试
      

  7.   


    Jump directly to a specific item in the adapter data.
    Parameters:
    position 
    animate这个应该是控制动画的true/false
    恩,默认是有动画的,去掉动画试试但好像在我的demo里true和false都可以,我先试试我的工程中效果如何,稍等
      

  8.   

    我猜默认是在动画结束后才去正真setSelection,去掉动画就立即setSelection了
      

  9.   


    还不是很完美
    debug后发现情况是这样的如果用setSelection(int, boolean)
    执行情况是
    test_Spinner.setSelection(2);.................test_EditText.setText("写入测试");
    也就是说
    ...................test_EditText.setText("");这步没执行,好奇怪
      

  10.   

    onItemSelected这个方法应该是有用的你试试view.setText("");
      

  11.   

    其实我比较懒,昨天没去查源码,今天查了后发现setSelection(int)这个方法最终是会post到主线程的消息队列里的,而setSelection(int, boolean)是直接修改ui。区别就在这吧