我正在尝试动态添加额外的输入字段到我的视图。
我首先使用异步函数从url读取json字符串,并将其动态映射到带有GSON的hasmap的对象。
接下来我想迭代hashmap来创建和添加输入字段:
public class NewProductActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.add_product);
TextView view = (TextView) this.findViewById(android.R.id.content);// is this the correct way to get view?
new loadTemplateAttributes(view).execute();// android studio complains about passing view here
.. snip...
class loadTemplateAttributes extends AsyncTask<String, String, HashMap> {
HashMap mymap;
.. snip...
protected void onPostExecute(HashMap mymap) {
pDialog.dismiss();
Iterator it = mymap.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pair = (Map.Entry) it.next();
String name = (String) pair.getKey();
TemplateAttribureProperties t = (TemplateAttribureProperties) pair.getValue();
String type = t.getType();
System.out.println("Name=" + name + " type=" + type);
LinearLayout ll = (LinearLayout) findViewById(R.id.linearLayout2);
// add text view
TextView tv = new TextView(this); // 'this' is unknow here
tv.setText(name);
ll.addView(tv);
EditText et = new EditText(view); // 'view' is what i want to pass but dont know how
et.setText();
ll.addView(et);
it.remove();
}
问题是&#39;这个&#39;在onPostExecute函数中是未知的。
我读到了一些关于将视图传递给异步函数的内容,但对我而言,目前还不清楚如何在第一时间获取视图以及如何在...后传递视图...
也有很多选项似乎不起作用,因为它们已被弃用或不安全,因为可能会根据评论引入内存泄漏。
真的迷失在这里。
答案 0 :(得分:0)
我不知道你在做什么但是你可以在onCreate()之前使用Context context;
和TextView view;
使其成为全局,然后你可以在你的方法中调用TextView tv = new TextView(context);
。
public class NewProductActivity extends Activity {
Context context=this;
private TextView view;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.add_product);
view = (TextView) findViewById(android.R.id.content);
}
答案 1 :(得分:0)
new loadTemplateAttributes(view).execute(); // android studio抱怨在这里传递视图
你必须在asynctask中添加构造函数,如:
class loadTemplateAttributes extends AsyncTask<String, String, HashMap> {
View view;
public loadTemplateAttributes(View v) {
view = v;
}
TextView tv = new TextView(this); //'这个'这里不知道
来自java中的内部类,在您的情况下使用NewProductActivity.this
语法引用父类。
EditText et = new EditText(view); //'view'是我想传递但不知道怎么做的 et.setText();
如上所述,您可以将aproach与构造函数一起使用,或直接引用活动视图:NewProductActivity.this.view
。但是你必须在你的活动中查看一个类字段。
高级:使您的活动成为内部类而不是静态,并且还将视图传递给它,可能会导致引用泄漏,并且在您使用由于屏幕旋转而无效的视图(在AsyncTask内部)时也会崩溃。如果您的AsyncTask正在进行网络操作,这尤其可行。为了防止它始终使AsyncTasks成为静态,如果您将视图或活动传递给它们,那么将这些引用包装在WeakReference<>