0

所以我从 Parse 中检索图像并在 ScrollView LinearLayout 中动态显示它们,但我似乎无法添加 clickListener 或将它们添加到视图中。这是我所拥有的:

MyTaskParams params = new MyTaskParams(drinkList.get(j).getString("Name"), data, lPos, drinkList.get(j).getObjectId(), j);
                        MyTask myTask = new MyTask();
                        myTask.execute(params);

然后在我传递所有数据并尝试将 ImageButton 添加到视图中。

private static class MyTaskParams {
        String name;
        byte[] data;
        int lPos;
        String id;
        int j;

        public MyTaskParams(String name, byte[] data, int lPos, String id, int j) {
            this.data = data;
            this.name = name;
            this.lPos = lPos;
            this.id = id;
            this.j = j;
        }
    }

    private class MyTask extends AsyncTask<MyTaskParams, Void, MyTaskParams> {
        @Override
        protected MyTaskParams doInBackground(MyTaskParams... params) {
            String name = params[0].name;
            byte[] data = params[0].data;
            int lPos = params[0].lPos;
            String id = params[0].id;
            int j = params[0].j;

            Log.d("DOINBACKGROUND", data.toString());

            bmp = BitmapFactory.decodeByteArray(data, 0, data.length);
            btn = new ImageButton(getActivity());
            btn.setId(j);
            btn.setTag(name);
            btn.setImageBitmap(bmp);
            btn.setBackgroundDrawable(null);
            btn.setMaxHeight(100);
            btn.setMaxWidth(100);
            btn.setOnClickListener(new DrinkButtonListener(getActivity(), lPos, id));
            lLayout[lPos].addView(btn);

            return null;

        }
    }

为什么我不能创建 ClickListener 或将按钮添加到视图中?我得到错误:

“只有创建视图层次结构的原始线程才能触及它的视图”

4

4 回答 4

0

您无法触及 Main 的其他方面的视图。

如果要操作视图,可以将可运行的内容发布到类似的视图中

myView.post(new Runnable(...));
于 2013-04-08T22:12:24.880 回答
0

一旦你在 doInBackground() 中,你就不再在 UI 线程中了。在史前时代,您可以尝试从后台更新 UI,但这不是一件好事。

如果您尝试,他们会更改 Android 以引发错误,这是一件不好的事情。

您可以使用特定方法解决它。看

工作线程了解更多信息。

我倾向于认为有更强大的方法来做你正在做的事情,但它们更复杂。不过,你已经有了基本的想法。您应该花很长时间参加Sending Operations to Multiple Threads培训班 ,这可能会给您更多的想法。

于 2013-04-08T22:16:31.940 回答
0

您可以通过在AsyncTask中实现 onProgressUpdate 或 onPostExecute 方法来更新 UI 。

在您的情况下,您可能希望使用 onPostExecute。

private class MyTask extends AsyncTask<MyTaskParams, Void, Bitmap> {
    @Override
    protected MyTaskParams doInBackground(MyTaskParams... params) {
        String name = params[0].name;
        byte[] data = params[0].data;
        int lPos = params[0].lPos;
        String id = params[0].id;
        int j = params[0].j;

        Log.d("DOINBACKGROUND", data.toString());

        return BitmapFactory.decodeByteArray(data, 0, data.length);
    }

    @Override
    protected void onPostExecute(Bitmap bmp) {
        btn = new ImageButton(getActivity());
        btn.setId(j);
        btn.setTag(name);
        btn.setImageBitmap(bmp);
        btn.setBackgroundDrawable(null);
        btn.setMaxHeight(100);
        btn.setMaxWidth(100);
        btn.setOnClickListener(new DrinkButtonListener(getActivity(), lPos, id));
        lLayout[lPos].addView(btn);
    }
}
于 2013-04-09T01:36:05.213 回答
0

您可以对Log.e使用以下代码并在按钮上设置值。

这是代码。

yourclassname.this.runOnUiThread (new Runnable(){

            public void run() {

                NameUser.setText(name);
                Id.setText(email);
                cimg.setImageBitmap(btmp);
                add1.setText(address1);
                add2.setText(address2);
                City.setText(city);
                State.setText(state);
                Pincode.setText(pincode);
                Country.setText(country);
                Mobile.setText(mobile);
                Skills.setText(skills);

            }
        });
于 2015-10-14T10:05:07.913 回答