简体   繁体   中英

Java: How to do TextView.setText in another package?

I'm new to Java, I'm trying to build something in Android Studio. The point is to 'push' a value for TextView baseTickVar in class BaseScreen, from another PACKAGE, where the class CoreFunctionality resides. Each time the tickNumber increases I want that shown in the TextView, so it's not a one time setting of text.

I have tried interfaces, but interfacing won't allow variables, only constants. I've tried TextView.setText from the CoreFunctionality package, but that gave a nullpointerException and declaring the TextView to counter that didn't seem to help.

public class BaseScreen extends Activity implements View.OnClickListener {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_base_screen);

    // some irrelevant code here so i left it out.

    TextView baseTickVar = (TextView)findViewById(R.id.baseTickVar);        
    baseTickVar.setText("1"); // just to not have it empty...

}

Now I want to set value of baseTickVar with a variable from the other package CoreFunctionality

public class CoreFunctionality extends Activity implements Runnable {

Thread tickThread = null;
volatile boolean playingGalactic;
long lastTick;
public int tickNumber;
int tickLength;
TextView baseTickVar;

public void controlTicks() {

    tickLength = 2000;
    long timeThisTick = (System.currentTimeMillis() - lastTick); 
    long timeToWait = tickLength - timeThisTick; 
    if (timeToWait > 0) {
        try {
            tickThread.sleep(timeToWait);
        } catch (InterruptedException e) {
        }
    }
    lastTick = System.currentTimeMillis();
}

@Override
public void run() {

    while (playingGalactic) {
        controlTicks();
        tickNumber++;
        Log.i("Tick number ", "" + tickNumber);
        updateTick();
    }
}

private void updateTick() {
    // this is the whole point...
    baseTickVar.setText("" + tickNumber);
}

public void resume() {
    playingGalactic = true;
    tickThread = new Thread(this);
    tickThread.start(); 

}

I guess your BaseScreen is the main screen and CoreFunctionality is some component that is doing some work. Actually CoreFunctionality does not need to be Activity , it better fits to be a service.

  1. You have to somehow pass reference to baseTickVar to the CoreFunctionality .
  2. It is not allowed to mess with UI elements (such as TextView ) from within another thread. You should consider using some inter-thread communication (such as Message ).

Make BaseScreen to extend Handler or make a Handler object in it then override

public void handleMessage(Message msg) {
    baseTickVar.setText("" + msg.obj);
}

In CoreFunctionality

private void updateTick() {
    Message msg=new Message();
    msg.obj=tickNumber;
    h.sendMessage(msg);
}

Of course you'll have to pass the h reference to CoreFunctionality .

Maybe not 100% accurate but it should work with little tweaking. Hope this will help.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM