android:是否有可能从MainActivity类继承?

时间:2016-07-11 12:08:13

标签: java android inheritance findviewbyid

我在一周前开始学习Java和Android Development,我有一些我想知道的基本知识。

我的应用程序的功能是它有10个按钮,每个按钮被点击一次后被禁用。如果单击了总共5个按钮,则必须禁用所有按钮。 我没有使用按钮阵列,但我想知道为什么这不起作用。 (已完成所有必要的进口)

  

MainActivity课程如下:

public class MainActivity extends AppCompatActivity {

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

Class1 c1object = new Class1();

TextView textobj;
Button Button1,Button2,Button3,Button4 /* similarly for the other 6 buttons*/ ;

public void StartText(){
    textobj = (TextView)findViewById(R.id.textView);
    textobj.setText("No Button has been clicked");
}

public void Click1(View view)
{
    Button1 = (Button)findViewById(R.id.button1);
    c1object.disablebutton(Button1,textobj,1);

}
public void Click2(View view)
{
    Button2 = (Button)findViewById(R.id.button2);
    c1object.disablebutton(Button2,textobj,2);
}
public void Click3(View view)
{
    Button3 = (Button)findViewById(R.id.button3);
    c1object.disablebutton(Button3,textobj,3);
}

public void Click4(View view)
{
    Button4 = (Button)findViewById(R.id.button4);
    c1object.disablebutton(Button4,textobj,4);

}
// Similarly for 6 more buttons

}
  

Class1就是这样:

public class Class1 {

Class2 c2object = new Class2();

private int Clickcount=0;

public void disablebutton(Button b, TextView t, int i) {
    b.setEnabled(false);
    String str = Integer.toString(i);
    t.setText("You clicked button: " + str);
    Clickcount++;
    if(Clickcount==5)
        c2object.disableAll();
}
}
  

最后,Class2是这样的:

public class Class2 {

MainActivity mainobject = new MainActivity();

public void disableAll(){

    mainobject.Button1.setEnabled(false);
    mainobject.Button2.setEnabled(false);
    mainobject.Button3.setEnabled(false);
    mainobject.Button4.setEnabled(false);
    //Similarly for the other 6 buttons

}

}

如果我运行此应用程序,我的应用程序会启动,但会显示一个白色屏幕并关闭应用程序。

经过多次尝试,我意识到当我创建MainActivity类的对象时总会发生这种情况。 我甚至尝试继承MainActivity,但结果是一样的。

我也尝试将Class2更改为:

public class Class2 {

public void disableAll(){

    Button b1 = (Button)findViewById(R.id.button1);
    b1.setEnabled(false);
//Similarly for the other 9 buttons

}

}

我注意到我不能在这里使用findViewById

这些是我想知道的事情:

  1. 我们可以继承或创建MainActivity的对象吗?

  2. 为什么我不能使用findViewById以外的其他类别的MainActivity

  3. 如何在Clickcount==5之后停用所有按钮?

  4. 您已经看过我的编码方式了。我需要遵循的任何做法?还有其他建议可以让我更好地编码吗?

  5. 提前感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

您无法通过其构造函数实例化Activity类。所以你不能写MainActivity mainObject = new MainActivity()。您仍然不希望这样做,即使有可能,因为您要创建MainActivity的新实例,而您想对现有中的按钮进行操作MainActivity

解决这个问题的一种方法是提供MainActivity作为参数,既不是你的方法也不是构造函数。即。

class ClassTwo {

    private MainActivity activity;

    ClassTwo(MainActivity activity) {
        this.activity = activity;
    }

    void disableAll() {
        activity.btn1.setEnabled(false);
        //etc...
    }

}

就我个人而言,虽然我认为传递Activity这里的内容有点矫枉过正,但当你想要做的就是按钮时。因此,您可以将按钮作为构造函数参数而不是活动传递:

ClassTwo(Button[] btns) {
    this.btns = btns;
}

或者,您可以传递interface。或者您可以考虑在方法中提供Button作为参数,而不是将它们存储在实例变量中(我可能会这样做):

class ClassTwo {

    ClassTwo(){} //Default, empty constructor

    void disableAll(Button[] btns) {
        for (Button btn : btns) {
            btn.setEnabled(false);
        }
    }

}

答案 1 :(得分:0)

你必须用(findViewByID(R.id.button)初始化按钮并添加

setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v){ // action} 
});

答案 2 :(得分:0)

您可以像这样创建Class2对象:

public Class2(MainActivity mainactivity){
    this.mainobject =mainactivity;
}

然后在MainActivity' onCreate

Class2  class2=new Class2(MainActivity.this);

如果要在Class2中找到Button,可以使用

mainobject.getCurrentView().findviewByID()