尝试更新MainActivity之外的UI元素

时间:2019-05-21 18:30:08

标签: java android

作为序言,我是一名学生,对Java /编程尚不陌生。我对android框架很陌生。我希望5个骰子的ImageView循环循环播放,就像它们滚动一样。我相信我遇到的主要问题是我的UI更改发生在onCreate()之外。有没有办法桥接MainActivity和单独的Java类?

MainActivity

  super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);



        Button rollButton = (Button) findViewById(R.id.rollButton);
        rollButton.setOnClickListener( new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Thread die1 = new Thread((Runnable) new ShipDriver(0));

                die1.start();

单独的Java类

public class ShipDriver implements Runnable {
    ImageView imageView;
    ImageView imageView2;
    ImageView imageView3;
    ImageView imageView4;
    ImageView imageView5;
    int dieIndex;
    int rolled;
    Handler myHandlerObj;
    Runnable runnable;


    public static final Random RANDOM = new Random();


    public ShipDriver(int tdieIndex) {

        dieIndex = tdieIndex;

    }


    public void run() {
        rolled = randomDiceValue();
        Handler myHandlerObj = new Handler(Looper.getMainLooper());

        for(int i=0; i<40; i++) {

            try {

                Thread.sleep(1000);
            }catch (InterruptedException e) {
                e.printStackTrace();
            }

            if (dieIndex == 0) {
                myHandlerObj.post(new Runnable() {
                    @Override
                    public void run() {
                        switch (rolled) {
                            case 1:

                                imageView.setImageResource(R.drawable.die1);
                            case 2:
                                imageView.setImageResource(R.drawable.die2);
                            case 3:
                                imageView.setImageResource(R.drawable.die3);
                            case 4:
                                imageView.setImageResource(R.drawable.die4);
                            case 5:
                                imageView.setImageResource(R.drawable.die5);
                            case 6:
                                imageView.setImageResource(R.drawable.die6);

                    }
                }
                });
            if (dieIndex == 1) {
                myHandlerObj.post(new Runnable() {
                    @Override
                    public void run() {
                        switch (rolled) {
                            case 1:
                                imageView2.setImageResource(R.drawable.die1);
                            case 2:
                                imageView2.setImageResource(R.drawable.die2);
                            case 3:
                                imageView2.setImageResource(R.drawable.die3);
                            case 4:
                                imageView2.setImageResource(R.drawable.die4);
                            case 5:
                                imageView2.setImageResource(R.drawable.die5);
                            case 6:
                                imageView2.setImageResource(R.drawable.die6);
                        }
                    }
                });
            }

...... 

在logcat中,我收到此错误:

attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference

我有点不知所措。任何见识将不胜感激。

4 个答案:

答案 0 :(得分:0)

我认为问题在于您正在尝试在主线程之外进行UI更改,而您无法在Android上进行更改,而是尝试使用runOnUiThread,如下例所示:

runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                    }
                }

答案 1 :(得分:0)

您是否尝试过设置上下文? 我认为这会有所帮助...

尝试使用上下文上下文。

context.imageview.setImageResource

this.imageview.setImageResource

只是一个猜测

更新: 以这个为例

MainActivity

public static ImageView Warning_image;
public static TextView Warning_text;
public static Handler mainHandler = new Handler();
@Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Warning_image = findViewById(R.id.Status_Image);
    Warning_text = findViewById(R.id.Warning_text);

    Runnable rcWarningControl = new cWarningControl();

    rcWarningControl.run();

cWarningControl

public class cWarningControl extends MainActivity implements Runnable {
@Override
public void run() {
    while(true)
    {
     if (cGlobal_values.bBT_NOADAPTER) {
            mainHandler.post(new Runnable() {
                @Override
                public void run() {
                    MainActivity.Warning_image.setImageResource(R.mipmap.warnung_bt_red);
                    MainActivity.Warning_text.setText(R.string.warning_BT_NO_Adapter);
                }
            });

        }
        if (!cGlobal_values.bBT_GenState_on) {
            mainHandler.post(new Runnable() {
                @Override
                public void run() {
                    MainActivity.Warning_image.setImageResource(R.mipmap.warnung_bt_red);
                    MainActivity.Warning_text.setText(R.string.warning_BT_OFF);
                }
            });

        }
        if (cGlobal_values.bBT_GenState_on) {

            if (cGlobal_values.bBT_ConState_connected) {
                mainHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        MainActivity.Warning_image.setImageResource(R.mipmap.warnung_bt_green);
                        MainActivity.Warning_text.setText(R.string.warning_BT_ON_CON);
                    }
                });

            } else {
                mainHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        MainActivity.Warning_image.setImageResource(R.mipmap.warnung_bt_yellow);
                        MainActivity.Warning_text.setText(R.string.warning_BT_ON_NOCON);
                    }
                });
            }
        }
        Log.d(TAG, "run: ");
        sleep(1000);
  }      
}

}

但是

您必须在res中创建的字符串(R.string.XXX)或仅由您自己创建。 图像obj相同。

答案 2 :(得分:0)

未初始化对象时,将出现显示的错误。首先,您要初始化imageview对象。显示的错误不是线程错误。

答案 3 :(得分:0)

我发现我的零点异常。我的findViewByID(用于imageViews)设置不正确。我让他们寻找R.drawable.imgs。它必须是R.id.imageview。

但是,我遇到了一个新问题,即图像无法循环播放。我想我会做更多的挖掘。在为这个问题ash了40个小时之后,我很高兴能够取得进展。下面是我的解决方案的代码。


import android.annotation.SuppressLint;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Switch;


import java.util.Random;

public class MainActivity extends AppCompatActivity {

    public static ImageView imageView1;
    public static Handler mainHandler = new Handler();
    Button rollDie;


    @SuppressLint("ResourceType")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imageView1 = (ImageView) findViewById(R.id.imageView1);

        rollDie = findViewById(R.id.rollDie);
        rollDie.setOnClickListener( new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Runnable die1 = new ShipDriver(0);
                die1.run();


            }
        });
    }
}

ShipDriver类:

package com.example.bernh.cptshipmatecrew;

import android.annotation.SuppressLint;
import android.os.Handler;
import android.widget.ImageView;

import java.util.Random;

public class ShipDriver extends MainActivity implements Runnable {
    int dieIndex;
    Random random;
    int rolled;
    ImageView imageView1;
    Handler mainHandler = new Handler();


    public ShipDriver(int dieIndex) {
        this.dieIndex = dieIndex; //why do we declare this. Is this shipdriver obj or MainObj


    }

    @SuppressLint("ResourceType")
    @Override
    public void run() {
        Random random = new Random();


        rolled = random.nextInt(6) + 1;

        for (int i = 0; i < 30; i++) {
            try {
                Thread.sleep(500);
            } catch(Exception e) {
                e.printStackTrace();
            }

            if (dieIndex == 0) {
                mainHandler.post(new Runnable() {
                                       @Override
                    public void run() {
                        switch (rolled) {
                            case 1:
                                MainActivity.imageView1.setImageResource(R.drawable.die1);
                                break;
                            case 2:
                                MainActivity.imageView1.setImageResource(R.drawable.die2);
                                break;
                            case 3:
                                MainActivity.imageView1.setImageResource(R.drawable.die3);
                                break;
                            case 4:
                                MainActivity.imageView1.setImageResource(R.drawable.die4);
                                break;
                            case 5:
                                MainActivity.imageView1.setImageResource(R.drawable.die5);
                                break;
                            case 6:
                                MainActivity.imageView1.setImageResource(R.drawable.die6);
                                break;

                        }
                    }
                });
            }
//            if (dieIndex == 1) {
//                mainHandler.post(new Runnable() {
//                    @Override
//                    public void run() {
//                        switch (rolled) {
//                            case 1:
//                                MainActivity.imageView.setImageResource(R.drawable.die1);
//                            case 2:
//                                MainActivity.imageView.setImageResource(R.drawable.die2);
//                            case 3:
//                                MainActivity.imageView.setImageResource(R.drawable.die3);
//                            case 4:
//                                MainActivity.imageView.setImageResource(R.drawable.die4);
//                            case 5:
//                                MainActivity.imageView.setImageResource(R.drawable.die5);
//                            case 6:
//                                MainActivity.imageView.setImageResource(R.drawable.die6);
//
//                        }
//                    }
//
//                });
//            }
//            if (dieIndex == 2) {
//                mainHandler.post(new Runnable() {
//                    @Override
//                    public void run() {
//                        switch (rolled) {
//                            case 1:
//                                MainActivity.imageView.setImageResource(R.drawable.die1);
//                            case 2:
//                                MainActivity.imageView.setImageResource(R.drawable.die2);
//                            case 3:
//                                MainActivity.imageView.setImageResource(R.drawable.die3);
//                            case 4:
//                                MainActivity.imageView.setImageResource(R.drawable.die4);
//                            case 5:
//                                MainActivity.imageView.setImageResource(R.drawable.die5);
//                            case 6:
//                                MainActivity.imageView.setImageResource(R.drawable.die6);
//
//                        }
//                    }
//
//                });
//            }
//            if (dieIndex == 3) {
//                mainHandler.post(new Runnable() {
//                    @Override
//                    public void run() {
//                        switch (rolled) {
//                            case 1:
//                                MainActivity.imageView.setImageResource(R.drawable.die1);
//                            case 2:
//                                MainActivity.imageView.setImageResource(R.drawable.die2);
//                            case 3:
//                                MainActivity.imageView.setImageResource(R.drawable.die3);
//                            case 4:
//                                MainActivity.imageView.setImageResource(R.drawable.die4);
//                            case 5:
//                                MainActivity.imageView.setImageResource(R.drawable.die5);
//                            case 6:
//                                MainActivity.imageView.setImageResource(R.drawable.die6);
//
//                        }
//                    }
//
//                });
//            }
//            if (dieIndex == 4) {
//                mainHandler.post(new Runnable() {
//                    @Override
//                    public void run() {
//                        switch (rolled) {
//                            case 1:
//                                MainActivity.imageView.setImageResource(R.drawable.die1);
//                            case 2:
//                                MainActivity.imageView.setImageResource(R.drawable.die2);
//                            case 3:
//                                MainActivity.imageView.setImageResource(R.drawable.die3);
//                            case 4:
//                                MainActivity.imageView.setImageResource(R.drawable.die4);
//                            case 5:
//                                MainActivity.imageView.setImageResource(R.drawable.die5);
//                            case 6:
//                                MainActivity.imageView.setImageResource(R.drawable.die6);
//
//                        }
//                    }
//
//                });
//            }

        }
    }
}