Android:在多项活动中更新文字视图

时间:2017-05-04 09:58:40

标签: java android multithreading

我需要做一些关于执行以下操作的建议:

  • 假设我有10/20(数量无关紧要)的活动。
  • 每个活动都有一个文本视图,应该像计数器一样工作。
  • 每个活动都有一个按钮,可以转到下一个活动。
  • 此计数器在应用程序启动时启动,并且每秒递增一次。

所以我到目前为止所做的是:

  • 在我的主活动中有一个实例化扩展Thread的类的方法。
  • 在run()方法的那个类中,i在第二个传递时递增一个变量。

现在我坚持下一步应该做的事情。任何指针都将不胜感激。

编辑:我需要一种方法从run方法内部到现在当前在屏幕上的任何活动进行通信,以更新其textview。

4 个答案:

答案 0 :(得分:1)

对于标准Object Oriented Programming,这里只是一些理论:坚持推荐的原则,如松散耦合,这使得您的项目代码相互之间的联系更少。您可以稍后阅读更多内容。

现在,使用Events,您可以设置一个与自然Publisher/Subscriber设计模式同义的系统。像这样:

其他活动需要notify的活动称为Publisher,其他需要notified的活动称为Subscribers

从这里开始:

已经建立并经过测试的库可以在android中执行事件。喜欢我最喜欢的EventBus

第1步将此行添加到app-level build.gradle文件中:

compile 'org.greenrobot:eventbus:3.0.0'

然后创建一个简单的Plain Old Java Object又名POJO类,如下所示:

public class UpdateTextViewEvent{
    private String textToShow;

    public UpdateTextViewEvent(String text){
       this.textToShow = text;
    }

    //add your public getters and setters here
}

第2步通知他人:

如果您想要通知任何人这些更改,您只需调用此方法:

EventBus.getDefault().post(new UpdateTextViewEvent("Some new Text"));

第3步:接收通知

对于想要收到此事件通知的人,只需执行以下操作:

@Override
public void onStart() {
   super.onStart();
   EventBus.getDefault().register(this);
}

@Override
public void onStop() {
   super.onStop();
   EventBus.getDefault().unregister(this);
}

注意:要实际处理事件:

@Subscribe
public void onEvent(UpdateTextViewEvent event){

   String text = event.getTextToShow();

   //now you can show by setting accordingly on the TextView;

}

这样做更容易,通过消除不同活动中的static引用来解耦代码

我希望这有帮助!祝你好运!

答案 1 :(得分:0)

将第二课中的Textview设为

  public static Textview text;

并在主要活动中将其称为

  SecondActivity obj=new SecondActivity();
    obj.text.settext("");

答案 2 :(得分:0)

您可以创建另一个活动,例如BaseActivity随Activity类扩展,您的所有10/20活动都使用创建的BaseActivity类扩展。

您可以将文本视图与protected访问说明符一起使用。

答案 3 :(得分:0)

您需要做的是在柜台类内部,创建一个方法并传入TextView作为参数。然后创建一个int变量并将计数器设置为实例:

喜欢这个

   public static class Counter extends Thread{
        private static int x;
        @Override
        public void run(){
            x = counter;
        }

        public void setCounter(TextView tv){
            tv.setText(String.valueOf(x));
        }
    }

现在在您要显示计数器的所有活动的setCounter(TextView)方法中调用此方法onCreate(),并将布局TextView作为参数传递。喜欢这个

...
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState):
....
TextView cTextView = (TextView)findViewById(R.id.texT1);
Counter c = new Counter();
c.setCounter(cTextView);
}