【问题标题】:Android dynamic layout only shows after oncreate method finishesAndroid 动态布局仅在 oncreate 方法完成后显示
【发布时间】:2016-05-16 23:54:03
【问题描述】:
   isAnswered=0;
 @Override
        protected void onCreate(Bundle savedInstanceState) {
            Log.d(TAG,"1isanswered : "+isAnswered);
            Log.d(TAG, "matchinggame OnCreate");
            super.onCreate(savedInstanceState);
            dbHandler = new DatabaseHandler(this);
            rLayout = new RelativeLayout(this);
            object = new ObjectObject();
            imageAnswer=new ImageView(this);
            setContentView(rLayout);


            trainingID = getIntent().getExtras().getInt("trainingid");
            trainingObjectList = new ArrayList<TrainingObject>();

            trainingObjectList = dbHandler.getAllTrainingObject(trainingID);
    //// TODO: 02.05.2016 egitim kismi oalcak burda tek tek gosterilecek

            rLayout.setBackgroundColor(Color.MAGENTA);





           // Handler handler = new Handler(); Log.d(TAG,"2isanswered : "+isAnswered);
            for(int i=0;i<2;i++){Log.d(TAG,"i:"+i); Log.d(TAG,"3tisanswered : "+isAnswered);
                final int finalI = i;


                //  handler.postDelayed(new Runnable() {

                  //  @Override
               //     public void run() {Log.d(TAG,"thread i: "+finalI);
                        Log.d(TAG,"4isanswered : "+isAnswered);
                 isAnswered = 0;
                TrainingObject trainingObject = new TrainingObject();
                trainingObject = trainingObjectList.get(finalI);
                objectCount = 2;
    //test icin
                Log.d(TAG,"testicin trainingobjectid: "+trainingObject.getTrainingobjectID());
                object = dbHandler.getObjectObject(trainingObject.getTrainingobjectAnswer());

                if(trainingObject.getTrainingobjectThree()!=0) objectCount++;
                if(trainingObject.getTrainingobjectFour()!=0) objectCount++;
                if(trainingObject.getTrainingobjectFive()!=0) objectCount++;
                Log.d(TAG,"matchinggame objcount: "+objectCount);

                RelativeLayout.LayoutParams rLayParams = new RelativeLayout.LayoutParams(140,140);

                rLayParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
                rLayParams.addRule(RelativeLayout.CENTER_IN_PARENT);

                 imgBytes = object.getObjectImageBlob();
                 bmp = BitmapFactory.decodeByteArray(imgBytes, 0, imgBytes.length);

                imageAnswer.setImageBitmap(bmp);
                imageAnswer.setTag(trainingObject.getTrainingobjectAnswer());
                imageAnswer.setId(R.id.imgAnswer);
                rLayout.removeAllViews();
                rLayout.addView(imageAnswer,rLayParams);




                        imageOne.setOnDragListener(MatchingGame.this);


                imageAnswer.setOnTouchListener(new View.OnTouchListener() {
                    @Override
                    public boolean onTouch(View v, MotionEvent event) { Log.d(TAG,"6isanswered : "+isAnswered);
                        Log.d(TAG,"matchinggame setontouch");
                        if (event.getAction() == MotionEvent.ACTION_DOWN) {
                            Log.d(TAG,"matchinggame setontouch if yes");
                            ClipData data = ClipData.newPlainText("", "");
                            View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(v);
                            v.startDrag(data, shadowBuilder, v, 0);
                            v.setVisibility(View.INVISIBLE); Log.d(TAG,"7isanswered : "+isAnswered);
                            return true;
                        } else { Log.d(TAG,"8isanswered : "+isAnswered);
                            return false;
                        }
                    }
                });

                imageAnswer.setOnDragListener(MatchingGame.this);
                Log.d(TAG,"*");
                while(isAnswered==0){
                    //Log.d(TAG,"*");
                }

                //  }
              //  }, 30000*finalI );Log.d(TAG,"thread sonrasi: "+finalI); Log.d(TAG,"5isanswered : "+isAnswered);
            }Log.d(TAG,"ff");
        }

因为 isanswered=0,它一直处于无限循环中。但我看不到我的布局,我只看到洋红色,而这个循环继续。几秒钟后黑屏出现。

但是当我在那里禁用时,在打印 ff 到日志后,它会完成 oncreate 然后布局更改。

我搜索了但没有答案。

Android layout only showing after oncreate method finishes

这里说try onstart。是的,我试过了,但是一样。

我这里只有 asynctask 调用来从 sqlite 获取值。

我有一个 for 循环,在每次迭代中,我都会显示图像,用户会尝试匹配它们。

我没有使用视图或片段。

为什么它一看到就没有发布到屏幕上?

完整的活动在这里:

https://gist.github.com/anonymous/87ccd4147ae0d202244bb78f51844f29

【问题讨论】:

    标签: android sqlite android-layout


    【解决方案1】:

    发生这种情况是因为在 onCreate 方法完成之前未显示活动。尝试将您的代码移动到onResume 并查看它是否有效。另外,在您当前的代码中,不要忘记调用super.onCreate(savedInstanceState)

    【讨论】:

    • same :( 我在 for 循环之后使用代码 onresume 但没有工作。
    • 所以如果 oncreate 必须完成更新布局,我该怎么做?因为我在 for 循环中有 5 次迭代,每次迭代都有不同的布局
    • 我建议使用AsyncTask 并更新您的布局onPostExecuted。你可以在这里进一步阅读developer.android.com/intl/es/reference/android/os/…
    • 但是当拖动为真时我无法在那里同步,gooher 迭代?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多