我不得不问这个因为我真的在与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(){
谢谢。
答案 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
的视图。