2016-07-11 91 views
0

我剛開始學習Java和Android Development就在一個星期前,我有幾個基本的東西,我想知道。android:是否有可能從MainActivity類繼承?

我的應用程序的功能是它有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. 你已經看到了我的編碼方式。我需要遵循的任何做法?任何其他建議,使我的編碼方式更好?

感謝您提前給予的幫助!

+0

禁用按鈕,if語句,其中有一個if(Clickcount == 5){myButton.setEnabled(false); }並根據需要爲其設置多個按鈕。此外,我不會建議圍繞創建MainActivity類的實例來構建您的代碼。如果您需要創建對象的實例,請創建另一個類來完成此操作。雖然我不確定findViewById部分。 – Michael

+0

這就是我所做的。問題是我無法從這個類訪問myButton而不創建MainActivity的對象。但是這樣做會讓我的應用崩潰。 –

+0

您可以嘗試製作MainActivity靜態並將所有禁用按鈕代碼放入MainActivity中的靜態方法中。只是所以你不必實例化。當它崩潰時,你會得到什麼錯誤? – Michael

回答

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 S,而不是將它們存儲在一個實例變量(我可能會去這一點):

class ClassTwo { 

    ClassTwo(){} //Default, empty constructor 

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

} 
0

你必須用(findViewByID(R.id。))初始化按鈕。按鈕),添加

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

您可以創建的Class2對象是這樣的:

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

然後在MainActivity的onCreate

Class2 class2=new Class2(MainActivity.this); 

當你想找到的Class2按鈕,你可以使用

mainobject.getCurrentView().findviewByID() 
相關問題