ImageView背景在方向更改后不显示图像

时间:2011-12-17 16:46:24

标签: java android imageview screen-orientation

编辑:如果在调用onConfigurationChanged时有人想要答案我只是初始化我在onCreate中所做的所有变量

您好我有一个应用程序显示进度对话框,然后在从相机拍摄的图像视图中显示图像。问题是当我在横向拍摄照片时,然后等待对话框完成任何图像视图中没有显示的内容,并且没有按钮工作。它常常在对话框即将显示时崩溃,但我修复了它。以下是我的一些代码:

public class AnnoyingMeterActivity extends Activity {

    Random r = new Random(System.currentTimeMillis());


    class ProgressThread extends Thread {
        Handler mHandler;
        final static int STATE_DONE = 0;
        final static int STATE_RUNNING = 1;
        int mState;
        int total;

        ProgressThread(Handler h) {
            mHandler = h;
        }

        public void run() {
            mState = STATE_RUNNING;
            total = 0;
            while (mState == STATE_RUNNING) {
                try {
                    Thread.sleep(55);
                } catch (InterruptedException e) {

                }
                Message msg = mHandler.obtainMessage();
                msg.arg1 = total;
                mHandler.sendMessage(msg);
                total++;
            }
        }

        /*
         * sets the current state for the thread, used to stop the thread
         */
        public void setState(int state) {
            mState = state;
        }
    }

    TextView tv;
    ImageView iv;
    TextView tv1;
    static final int PROGRESS_DIALOG = 0;
    ProgressThread progressThread;
    ProgressDialog progressDialog;
    Bitmap person;
    ImageView tiv;
    ImageView iv2;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button scanPersonButton = (Button) findViewById(R.id.scanPerson);
        scanPersonButton.setOnClickListener(new View.OnClickListener() {

            public void onClick(View arg0) {
                scanPerson();

            }
        });
        tv = (TextView) findViewById(R.id.tv);
        iv = (ImageView) findViewById(R.id.annoyingMeterImage);
        iv.setBackgroundResource(R.drawable.finalmeter);
        tv1 = (TextView) findViewById(R.id.textView1);
        tiv = (ImageView) findViewById(R.id.imageView1);


    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
      super.onConfigurationChanged(newConfig);
      setContentView(R.layout.main);
    }


    protected void scanPerson() {

        Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
        startActivityForResult(intent, 0);

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {
            person = (Bitmap) data.getExtras().get("data");
            showDialog(PROGRESS_DIALOG);
        }

    }

    protected void randomImageDisplayThing() {
                tiv.setBackgroundDrawable(new BitmapDrawable(person));
        switch (annoyingRating) {
        case 0:
            iv.setBackgroundResource(R.drawable.finalmeter0);
            break;
        case 1:
            iv.setBackgroundResource(R.drawable.finalmeter1);
            break;
        case 2:
            iv.setBackgroundResource(R.drawable.finalmeter2);
            break;
        case 3:
            iv.setBackgroundResource(R.drawable.finalmeter3);
            break;
        case 4:
            iv.setBackgroundResource(R.drawable.finalmeter4);
            break;
        case 5:
            iv.setBackgroundResource(R.drawable.finalmeter5);
            break;
        case 6:
            iv.setBackgroundResource(R.drawable.finalmeter6);
            break;
        case 7:
            iv.setBackgroundResource(R.drawable.finalmeter7);
            break;
        case 8:
            iv.setBackgroundResource(R.drawable.finalmeter8);
            break;
        case 9:
            iv.setBackgroundResource(R.drawable.finalmeter9);
            break;
        case 10:
            iv.setBackgroundResource(R.drawable.finalmeter10);
            break;
        case 11:
            iv.setBackgroundResource(R.drawable.finalmeter11);
            break;
        }

    }

    protected Dialog onCreateDialog(int id) {
        switch (id) {
        case PROGRESS_DIALOG:
            progressDialog = new ProgressDialog(this);
            progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            progressDialog.setMessage("Scanning...");
            return progressDialog;
        default:
            return null;
        }
    }

    final Handler handler = new Handler() {
        public void handleMessage(Message msg) {
            int total = msg.arg1;
            progressDialog.setProgress(total);
            if (total >= 100) {
                dismissDialog(PROGRESS_DIALOG);
                progressThread.setState(ProgressThread.STATE_DONE);
                randomImageDisplayThing();
            }
        }
    };

    @Override
    protected void onPrepareDialog(int id, Dialog dialog) {
        switch (id) {
        case PROGRESS_DIALOG:
            progressDialog.setProgress(0);
            progressThread = new ProgressThread(handler);
            progressThread.start();
        }



    }
}

现在我真的不知道该怎么做。我认为问题可能与方向改变有关。任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:0)

尝试使用AsyncTask代替自定义线程。因为有些事情是假设在UI线程上运行并且在后台线程上休息而AsyncTask使这很容易。同样通过查看线程代码来调试线程代码既困难又不可靠。

http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html http://developer.android.com/reference/android/os/AsyncTask.html