所以我从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或将按钮添加到视图中? 我收到错误:
“只有创建视图层次结构的原始线程才能触及其视图”
答案 0 :(得分:0)
你不能触及主要的另一个步骤中的视图。
如果您想操纵视图,可以将runnable发布到像
这样的视图myView.post(new Runnable(...));
答案 1 :(得分:0)
一旦你进入doInBackground(),你就不再是UI线程了。在史前的过去,你可以尝试从后台更新UI,但这不是一件好事。
要做到这一点并不是一件好事,如果你尝试的话,他们会改变Android以引发错误。
您可以使用特定方法解决它。参见
Worker Threads了解更多信息。
我倾向于认为有更强大的方式来做你正在做的事情,但它们更复杂。不过,你已经掌握了基本的想法。你应该在训练课上花很长时间 Sending Operations to Multiple Threads,可能会给你一些更多的想法。
答案 2 :(得分:0)
您可以通过在AsyncTask中实施onProgressUpdate或onPostExecute方法来更新用户界面。
在您的情况下,您可能希望使用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);
}
}
答案 3 :(得分: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);
}
});