2013-03-22 36 views
2

我正在編寫我的第一個Android應用程序,並且正在嘗試編寫一個應用程序,只需單擊一個按鈕即可顯示消息,並且可以根據需要多次執行此操作。到目前爲止,我有:Android/Java重複按鈕單擊

public class MyProject extends Activity 
{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     final TextView tv = new TextView(this); 
     Button startButton = (Button) findViewById(R.id.startbutton); 
     startButton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) { 
      tv.setText("Hello World!"); 
      setContentView(tv); 
      Handler handler = new Handler(); 
      handler.postDelayed(new Runnable() { 
      public void run() {setContentView(R.layout.main);}}, 2000);  
     } 
     }); 
    } 
} 

但是做這種方式,當我回到我的主屏幕,並再次點擊按鈕...沒有任何反應。我如何重複點擊按鈕來重複該行爲?

+0

什麼是再次調用setContentView()的目的? – user1969053 2013-03-22 03:59:38

+0

我建議使用ViewFlipper,而不是通過setContentView – ElefantPhace 2013-03-22 04:00:29

+0

反覆設置單獨的視圖。因此,設置ViewFlipper將解決問題,或者您的建議只是對風格/最佳實踐的評論?這是我的第一個Android應用程序,我不是很熟悉Java,所以我不太確定我在做什麼。哈哈= P – 2013-03-22 04:07:44

回答

0
TextView txt; 
// our handler 
Handler handler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 

//display each item in a single line 
    txt.setText(txt.getText()+"Item "+System.getProperty("line.separator")); 
    } 
}; 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    txt=(TextView)findViewById(R.id.txt); 
} 

@Override 
protected void onStart() { 
    super.onStart(); 
       // create a new thread 
    Thread background=new Thread(new Runnable() { 

    @Override 
    public void run() { 
    for(int i=0;i<10;i++) 
    { 
    try { 
    Thread.sleep(1000);  
    b.putString("My Key", "My Value: "+String.valueOf(i)); 
    // send message to the handler with the current message handler   

     handler.sendMessage(handler.obtainMessage()); 
    } catch (Exception e) { 
     Log.v("Error", e.toString()); 
    } 
    } 
    } 
    }); 

    background.start(); 
} 
} 

注:處理器類型一個線程不UDPATE這裏任何UI Take an example from here

2

你舉的例子非常簡單,從我的理解,不需要多線程。

您只需一次初始化您的佈局,然後您可以更新單個視圖的內容。

所以......這將設置的「Hello World」上的每個按鈕的點擊字符串,你會不會因爲字符串總是相同注意到任何區別:d

public class MyProject extends Activity 
{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     // this is needed one time only 
     setContentView(R.layout.main); 

     // add your textview in xml 
     final TextView tv = (TextView) findViewById(R.id.textView); 
     final Button startButton = (Button) findViewById(R.id.startbutton); 

     startButton.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View view) { 
       tv.setText("Hello World!"); 
      } 
     } 
    } 
} 

做更有趣的東西,你可以設置一個計數器來更新每次點擊,這樣textview的變化將會更明顯更有趣!

int i = 0; 
startButton.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View view) { 
     tv.setText("you have reached " + i); 
     i++; 
    } 
} 
+0

這樣做,我得到: 局部變量我訪問自在內部階層;需要最後申報\t \t i ++; 但是當我宣佈它是最終的,它抱怨並告訴我,它不能編輯它,因爲它的最後! – 2013-03-22 14:26:49

+0

沒關係,我通過將int i引入onClickListener循環來解決該問題。 – 2013-03-22 14:37:53

+0

但是,這種方法不會自動回到主佈局。當我將這兩者整合在一起時,我仍然遇到同樣的問題,即無法再次單擊該按鈕並具有相同的行爲。 – 2013-03-22 14:43:54

1

在這裏,你在呼喚setContentView以取代含TextView整個當前視圖的「Hello World!」然後在兩秒鐘後再次將setContentView設置回主佈局。由於OnCreate僅在創建活動時被調用一次,所以OnClickListener再也不會被設置。

此代碼將做你正在尋找。

public class MyActivity extends Activity 
    implements View.OnClickListener{ 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     init(); 
    } 

    private void init() { 
     setContentView(R.layout.main); 
     Button startButton = (Button) findViewById(R.id.startbutton); 
     startButton.setOnClickListener(this); 
    } 


    @Override 
    public void onClick(View v) { 
     TextView tv = new TextView(this); 
     tv.setText("Hello World!"); 
     setContentView(tv); 
     Handler handler = new Handler(); 
     handler.postDelayed(new Runnable() { 
      public void run() { 
       init(); 
      } 
     }, 2000); 
    } 
} 

您可能會注意到,在我的示例中,OnClick是一個單獨的方法。這是因爲我實現了接口View.OnClickListener。我能夠將實施的方法作爲我班的一部分編寫,然後將this作爲參數傳遞給setOnClickListener。我正在解釋這個,因爲你提到你是Java的新手。

+0

這工作。謝謝! – 2013-03-22 14:53:17

+0

我很高興它的工作! gpasci是正確的,因爲你通常不以這種方式使用'setContentView'。雖然它工作得很好,但在更復雜的示例中,您將需要像使用按鈕一樣在xml中定義「TextView」。另外,如果您通過單擊複選標記接受我的答案,它將有助於您在將來獲得更多答案。另外我喜歡上網點。祝你好運! – 2013-03-22 21:45:02