宣传部活动后期做什么:Android界面的几个问题

来源:百度文库 编辑:中财网 时间:2024/04/29 07:35:40
一、findViewByid 与 setContendView
1、Android界面的各个子元素,似乎应该在主Layout显示之后创建才可以。
   例如:

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);       
        setContentView(R.layout.main);
        tedit = (EditText)findViewById(R.id.EditText01);
    }

    public void  onResume(){
        super.onResume();   
        tedit.setText("abvcd");
    }

    上面代码运行正常。而如果,将其修改为如下,则运行就会出错。

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);   
        tedit = (EditText)findViewById(R.id.EditText01);    
        setContentView(R.layout.main);
    }

    public void  onResume(){
        super.onResume();   
        tedit.setText("abvcd");
    }
 
    而且,即使系统中没有onResume函数,改成如下实现,在单击button时,仍然会提示出错:

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);  
        tedit = (EditText)findViewById(R.id.EditText01);    
        setContentView(R.layout.main);
        Button btn = (Button)findViewById(R.id.Button01);
        btn.setOnClickListener( new View.OnClickListener() {           
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                tedit.setText("abvcd");
            }
        }); 
    }
  
    这说明,一定不是因为onCreate与onResume之间时间过短资源未准备好而导致的,而从源码和原理上来说,也应该时间间隔过短资源未准备好没什么关系。个人理解,findViewById,是按照id去获取view,则应该在view加载之后才可以。而 setContentView(R.layout.main)应该就是用来加载显示各个layout.main中的各个view控件的。所以本例中,findViewById应该在 setContentView 之后。事实上,将上面代码改成如下,进行测试之后,发现logcat果然有错误显示:

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);  
        tedit = (EditText)findViewById(R.id.EditText01);  
        if(null == tedit )
        {
            Log.e("Error","tedit is not found");
        }
        setContentView(R.layout.main);
    }

二、关于Activity启动时自动显示软键盘
【手记】
    1、据资料说,edit获得焦点时,会自动弹出相应的输入法软键盘。于是,在xml文件中,对EditText控件设置属性,设定输入法,并使其默认获得焦点(即设置获得焦点):

          android:id="@+id/EditText01"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:focusable="true"
          android:focusableInTouchMode = "true"
          android:inputType="textUri|number">
         

    
    然而,经试验发现不可以。于是,准备在Activity的onResume事件中通过代码为EditText设置焦点,之所以在onResume事件而不在onCreate事件中设置,是因为onCreate事件发生时,控件还不能进行相应操作。代码如下:

    public void  onResume(){
        super.onResume(); 
        tedit.requestFocus();
    }

   
    经过试验,发现上面的操作也并不能显示软键盘。于是... ...

    2、直接执行显示软键盘的代码,如下:
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);
        tedit = (EditText)findViewById(R.id.EditText01);  
        if(null == tedit )
        {
            Log.e("out","tedit is not found");
        }
        focusChangeListener = new OnFocusChangeListener()
        {
            @Override
            public void onFocusChange(View arg0, boolean arg1) {
                // TODO Auto-generated method stub
                if(tedit == arg0)
                {
                    if(arg1)
                    {
                        //tedit.setInputType( InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_URI);
                        ((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE)).showSoftInput(tedit,0);
                    }
                }
            }
           
        };
        tedit.setOnFocusChangeListener(focusChangeListener);
    }
    public void  onResume(){
        super.onResume();
        tedit.requestFocus();
        //tedit.setInputType( InputType.TYPE_CLASS_NUMBER | InputType.TYPE_TEXT_VARIATION_URI);//设置输入法格式,可以不要
        ((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE)).showSoftInput(tedit,0); //显示输入法
        tedit.performClick(); //代码执行Click事件
    }
   
    经过验证,发现这样也并不能将软键盘显示出来。于是重新搜索,发现网上有一个方法,可以利用timer来实现该效果。

    3、利用timer变通实现自动弹出软键盘
    原理是在onCreate实践中,起一个timer进行计时,在时间到时的回调函数中,执行软键盘显示代码。如下:

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main); 
        tedit = (EditText)findViewById(R.id.EditText01);  
        if(null == tedit )
        {
            Log.e("out","tedit is not found");
        }
        Timer timer = new Timer();
        timer.schedule(new TimerTask()
        {
            @Override
            public void run()
            {
                InputMethodManager imm =
                    (InputMethodManager)tedit.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
                //Toast.makeText(GuiTest.this, "show", Toast.LENGTH_SHORT).show();//GuiTest是Activity类名,这句不需要
            }
        }, 1000);
    }

    经试验,这样确实能实现软键盘自动弹出。注意,1000为延时值,不可太短,否则仍然谈不出来,也不可太长,否则activity启动半天之后才弹出,则失去意义了。
    另外,起timer也可以在onResume事件中完成。
参考资料:
1、http://blog.sina.com.cn/s/blog_4e5143100100i196.html?retcode=0

//隐藏软键盘  
((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(WidgetSearchActivity.this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);  
  
//显示软键盘,控件ID可以是EditText,TextView,android 1.6的SDK本身有问题,无法设置manifest文件或者直接show出软键盘,preformclick也不行,必须手动click一个控件  
((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE)).showSoftInput(控件ID, 0); 
//InputMethodManager im =(InputMethodManager)
            edit.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
  im.toggleSoftInput(0,InputMethodManager.HIDE_NOT_ALWAYS);

2、http://tech.cncms.com/shouji/android/41261.html

android 界面加载后弹出软键盘

核心提示:在onCreate函数中设定一个定时器,延迟一定时间,android 界面加载后弹出软键盘,弹出软键盘,不能弹出软键盘的主要原因是在onCreate函数中Android程序未将屏幕绘制完成

在onCreate函数中设定一个定时器,延迟一定时间,弹出软键盘。

不能弹出软键盘的主要原因是在onCreate函数中Android程序未将屏幕绘制完成。

Timer timer = new Timer();

timer.schedule(new TimerTask()

{

@Override

public void run() {

InputMethodManager imm =(InputMethodManager)vv.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);

imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);

Toast.makeText(test.this, "show", Toast.LENGTH_SHORT).show();

}

}, 1000);