마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

main의 textview를 다른 곳에서 사용하는 법

0 추천

핸들러를 따로 클래스화 했어요 

그핸들러에서 UI 변경을 하고 싶은데 

public TextView getCpu_status_value() {
    return cpu_status_value;
}

public void setCpu_status_value(TextView cpu_status_value) {
    this.cpu_status_value = cpu_status_value;
}

MainActivity 에서 TextVeiw를 겟터 셋터를 만들어 

public void handleMessage(Message msg) {
    super.handleMessage(msg);
    switch (msg.what)
    {
        case MAIN_UI_UPDATE:
            main=new MainActivity();
            main.getCpu_status_value().setText("" + msg.getData().getFloat("cpu"));

            break;

 

이렇게 사용하려고 하는데 

11-22 15:20:46.519 9726-9726/kr.co.igsinc.aquan E/AndroidRuntime: FATAL EXCEPTION: main
                                                                  Process: kr.co., PID: 9726
                                                                  java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
                                                                      at kr.co.igsinc.aquan.module.UiHanbler.handleMessage(UiHanbler.java:27)
                                                                      at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                      at android.os.Looper.loop(Looper.java:154)
                                                                      at android.app.ActivityThread.main(ActivityThread.java:6776)
                                                                      at java.lang.reflect.Method.invoke(Native Method)
                                                                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
                                                                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)

오류가 뜨네요.

TextView가 null이라는것같은데 

main에서 textview를 가져오려면 어떻게 해야하나요 ??

 

 

now882002 (3,860 포인트) 님이 2017년 11월 22일 질문

2개의 답변

0 추천
 
채택된 답변
Class를 초기화할 때, 파라미터로 MainActivity를 던져 주면,

클래스 생성자에서 private 변수로 받아 놓습니다.

그리고 핸들러에서 해당 public 메쏘드를 호출합니다.
Will Kim (43,170 포인트) 님이 2017년 11월 22일 답변
now882002님이 2017년 11월 22일 채택됨
public class MainActivity extends AppCompatActivity {
 private MainActivity mMainActivity;
public MainActivity(){

        mMainActivity=MainActivity.this;

    }
}

이렇게 생성하고

핸들러에서
public class UiHanbler extends Handler {
private MainActivity mMainActivity;
public  UiHanbler(){
        mMainActivity=new MainActivity();


    }
}
이렇게 가져오는거맞나요 ??
그렇게해도 null이네요 ㅜㅜ
public class UiHanbler extends Handler {
private MainActivity mMainActivity;
public  UiHanbler(MainActivity mact){
        mMainActivity=mact;


    }
}
이렇게 하고, handler 생성할 때, this를 넘겨주면 될 겁니다.
0 추천
아까 질문이랑 이어지는 것 같은데,

핸들러 말고 스레드를 따로 클래스화해서 그 값을 메세지로 MainActivty 핸들러로 넘겨주는 건 어떨까요
qpoas (1,240 포인트) 님이 2017년 11월 22일 답변
전체적으로 Android의 구조에 대한 이해가 선행되어야 합니다.
값을 서로 주고 받을 때는 크게 두가지 정도 사용합니다.

1. intent를 이용하는 방법
2. broadcast receiver를 이용하는 방법

2번을 선호하지만, 문제는 어떤 데이터를 주고 받으려고 하느냐죠. 별것 아니면 굳이 MainActivity에서 독립시킬 필요는 없을 수 있죠.
...