1

下面的代码片段,

公共类RelativeActivity扩展活动{

//  private Button ok_btn = (Button) findViewById(R.id.ok);
//  private EditText edit = (EditText) findViewById(R.id.editText01);
@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_relative);

    Button ok_btn = (Button) findViewById(R.id.ok);
    final EditText edit = (EditText)findViewById(R.id.editText01);
    ok_btn.setOnClickListener(new OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            Toast.makeText(getApplicationContext(), edit.getText().toString(), Toast.LENGTH_LONG).show();

        }
    });
}

这是正确的,但是如果我将这个 Button 实例 ok_btn 和这个 EditText 实例都设置为私有字段,如代码顶部注释掉的行所示,这会导致错误,为什么?先感谢您,

4

2 回答 2

3

findViewById()你得到一个错误,因为你在调用之前尝试使用setContentView(). 如果您使用:

private Button ok_btn;
private EditText edit;
@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_relative);

    ok_btn = (Button) findViewById(R.id.ok);
    edit = (EditText)findViewById(R.id.editText01);
    ok_btn.setOnClickListener(new OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            Toast.makeText(getApplicationContext(), edit.getText().toString(), Toast.LENGTH_LONG).show();

        }
    });
}

你不会得到错误,因为你在调用findViewById()之后调用setContentView()

于 2012-12-23T16:37:02.117 回答
0
//  private Button ok_btn = (Button) findViewById(R.id.ok);
//  private EditText edit = (EditText) findViewById(R.id.editText01);
@Override
protected void onCreate(Bundle savedInstanceState) 
{
  // your code..

此代码在运行时出错,因为您在为当前窗口(活动)设置布局之前尝试了两个访问按钮和 EditText。在默认的 Activity 布局中,这些到 Ui 元素不会退出,这就是您收到错误的原因。

解决方案,如果您只是在 Activity 的 onCreate 方法之前声明所有 UI 元素,并在设置已添加的 Ui 元素的 Activity 布局后初始化所有 UI 元素。

例如在您的代码中:

public class RelativeActivity extends Activity {

//****************** DECLARE ALL UI ELEMENTS HERE ****************/
private Button ok_btn;
private EditText edit;


@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_relative);

 //***************** INITIALIZE ALL ELEMENTS HERE AFTER setContentView


     ok_btn = (Button) findViewById(R.id.ok);
     edit = (EditText)findViewById(R.id.editText01);

    ok_btn.setOnClickListener(new OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            Toast.makeText(getApplicationContext(), 
             edit.getText().toString(), Toast.LENGTH_LONG).show();

        }
    });
}
于 2012-12-23T16:38:45.030 回答