2013-03-22 34 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