为什么按钮在第二个实例中实例化而不是第一个实例?

时间:2012-01-26 04:05:43

标签: java android oop

我不得不问这个因为我真的在与OOP挣扎,而这些是我不理解的OOP概念。请帮我。我在下面粘贴的代码来自Android Activity的onCreate方法,但即使不知道Android,您也可以回答。为什么不为此按钮实例化按钮对象:

buttonSaveMem2 = (Button)findViewById(R.id.save_mem2);
buttonSaveMem2.setOnClickListener(buttonSaveMem2OnClickListener);

虽然为这个创建了一个对象?

Button buttonStartAnother = (Button)findViewByI(R.id.startanother);        
buttonStartAnother.setOnClickListener(new Button.OnClickListener()
{

以下是该方法的完整代码:

   @Override
   public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.main);

   textSavedMem1 = (TextView)findViewById(R.id.savedmem1);
   textSavedMem2 = (TextView)findViewById(R.id.savedmem2);
   editText1 = (EditText)findViewById(R.id.edittext1);
   editText2 = (EditText)findViewById(R.id.edittext2);
   buttonSaveMem1 = (Button)findViewById(R.id.save_mem1);
   buttonSaveMem2 = (Button)findViewById(R.id.save_mem2);

   buttonSaveMem1.setOnClickListener(buttonSaveMem1OnClickListener);
   buttonSaveMem2.setOnClickListener(buttonSaveMem2OnClickListener);

   Button buttonStartAnother = (Button)findViewById(R.id.startanother);
   buttonStartAnother.setOnClickListener(new Button.OnClickListener(){

谢谢。

3 个答案:

答案 0 :(得分:1)

我从您的问题和代码中了解到的是,您只是在问下面两个陈述之间的区别?还有为什么这些陈述是这样写的?

buttonSaveMem2 = (Button)findViewById(R.id.save_mem2);

Button buttonStartAnother = (Button)findViewByI(R.id.startanother);

我说错了吗?如果是,那么请阅读以下答案,否则忘记它。

您正在考虑按钮 buttonStartAnother 在第二个语句中实例化,按钮 buttonSaveMem2 未在第一个语句中实例化。

实际上在onCreate()之前声明了按钮 buttonSaveMem2 。为什么他这样做是因为他必须在其他方法中使用 buttonSaveMem2 按钮。

但按钮 buttonStartAnother 不需要在任何其他方法中使用,因此他在 onCreate()中声明。

请参阅下面的代码模板,您将了解这一点。

public class Demo extends Activity {
    TextView textSavedMem1, textSavedMem2;
    Button buttonSaveMem1, buttonSaveMem2;
    EditText editText1, editText2;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        textSavedMem1 = (TextView)findViewById(R.id.savedmem1);
        textSavedMem2 = (TextView)findViewById(R.id.savedmem2);
        editText1 = (EditText)findViewById(R.id.edittext1);
        editText2 = (EditText)findViewById(R.id.edittext2);
        buttonSaveMem1 = (Button)findViewById(R.id.save_mem1);
        buttonSaveMem2 = (Button)findViewById(R.id.save_mem2);

        buttonSaveMem1.setOnClickListener(buttonSaveMem1OnClickListener);
        buttonSaveMem2.setOnClickListener(buttonSaveMem2OnClickListener);

        Button buttonStartAnother = (Button)findViewById(R.id.startanother);
        buttonStartAnother.setOnClickListener(new Button.OnClickListener(){
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub              
            }   
        });
    }       
    public void myMethod() {
        buttonSaveMem2.setText("myMethod called");
            // buttonSaveMem2 is accessible here because it is declared globally
        // buttonStartAnother.setText("hello");
            // If you remove comment on above line you will get error
            // because buttonStartAnother is invisible to this method
    }
}

我希望您能理解为什么按钮被实例化,如果您没有在上面的代码中检查myMethod,请检查。

答案 1 :(得分:0)

这不是OOP问题,它实际上是您实现的编码问题。

阅读android的基础知识...小部件是一个由android用来从用户那里获取输入的视图,这可以是点击或其他。特别是由于android的设计方式,所有小部件(视图)在使用时必须有一些方法来引用它们...输入方法fineViewById(xx)这用于查找具有此特定id的小部件/视图,通常是来自R.java文件。

了解之前的基础 之前开始编码,这将为您节省很多时间..

你可以从这里开始 - > http://developer.android.com/resources/browser.html?tag=tutorial

答案 2 :(得分:0)

问题几乎肯定是您的布局缺少ID为save_mem2的视图。第二个代码块工作的原因是存在标识为startanother的视图。