簡體   English   中英

android:是否可以從MainActivity類繼承?

[英]android : Is it possible to inherit from MainActivity class?

一周前,我開始學習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. 為什么不能使用MainActivity之外的另一個類的findViewById

  3. 如何在Clickcount==5之后禁用所有按鈕?

  4. 您已經了解了我的編碼方式。 我需要遵循的任何做法? 還有其他建議可以改善我的編碼方式嗎?

提前謝謝你的幫助!

您不能通過其構造函數實例化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 s作為方法中的參數提供,而不是將它們存儲在實例變量中(我可能會這樣做):

class ClassTwo {

    ClassTwo(){} //Default, empty constructor

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

}

您必須使用(findViewByID(R.id.button)初始化Button並添加

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

您可以這樣創建Class2對象:

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

然后在MainActivity的onCreate中

Class2  class2=new Class2(MainActivity.this);

當您想在Class2中找到Button時,可以使用

mainobject.getCurrentView().findviewByID()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM