动态添加视图而不显示视图

时间:2013-10-26 05:13:38

标签: android

我正在使用以下代码在我的布局中对其子LinearLayout下的视图进行充气:

LayoutInflater vi = (LayoutInflater)getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = vi.inflate(R.layout.your_layout, null);
// fill in any details dynamically here
TextView textView = (TextView) v.findViewById(R.id.a_text_view);
 textView.setText("your text");
// insert into main view
View insertPoint = findViewById(R.id.insert_point);
((ViewGroup) insertPoint).addView(v, 0, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));

但我看不到我的观点。当我将屏幕旋转到横向视图时,它会显示出来。如何解决这个问题?

编辑:

这基本上就是我在做什么。我有一个带有两个选项卡的TabActivity。我使用一个应用程序全局,它存储一个标志和我的TabActivity的TabHost。我还在第二个标签活动中使用一个线程,该活动持续监视应用程序全局以监视标志。当我单击第一个选项卡中的按钮时,我将全局设置为true。第二个选项卡中的线程检查其值。当它成立时,我运行异步任务并使用ApplicationGlobal中的TabHost stired将当前显示窗口移动到第二个选项卡。

第二个标签代码:

public class ShowDownloadsActivity extends Activity { 
private List<String> list;
ApplicationGlobal ap;
String tempUrl = "";
LinearLayout lly; 
LayoutInflater inflater;
Context con;
static int k = 0;
static int tmp = 0;
static int size = 0;
View insertPoint;
View v;

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.shwds); 
con = this; 
v = LayoutInflater.from(this).inflate(R.layout.downloadlistrow, null);
insertPoint = (View) findViewById(R.id.layout_vids);
inflater = (LayoutInflater) con .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
ap = (ApplicationGlobal) getApplication();
lly = (LinearLayout) findViewById(R.id.layout_vids);

Thread thread1 = new Thread() {
    public void run() { 
    try {
      boolean flg = ap.getFlag();
      if (flg) { 
    tempUrl = ap.getUrl(); ap.setUrl("");
   flg = false; 
  new downloadVideo().execute(); } }
 catch (Exception e) { e.printStackTrace(); } 
} };
thread1.run();
 }

class downloadVideo extends AsyncTask<Hashtable<String, String>, String, String> { 
String resp = "";
protected void onProgressUpdate(String... values) { }
@Override
protected void onPreExecute() {
// fill in any details dynamically here 
TextView textView = (TextView) v.findViewById(R.id.siz);
textView.setText("your text");
// insert into main view 
addContentView(v, new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT)); 
super.onPreExecute();
}

@Override
 protected String doInBackground(Hashtable<String, String>... prmss) { 
try {
final int return resp;
}
@Override
protected void onPostExecute(String result) { super.onPostExecute(result);
}
 }
 }

5 个答案:

答案 0 :(得分:3)

首先初始化要添加子视图的布局。

例如

LinearLayout layout=(LinearLayout)findViewById(R.id.your_root_layout);

然后像下面那样夸大您的布局

LayoutInflater mInflater = (LayoutInflater) getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    View v= (View) mInflater.inflate(R.layout.your_layout, null);
TextView textView = (TextView) v.findViewById(R.id.a_text_view);
textView.setText("your text");
LinearLayout.LayoutParams p = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.WRAP_CONTENT,
                LinearLayout.LayoutParams.WRAP_CONTENT);
layout.addView(textView, p);

希望这会对你有所帮助。

答案 1 :(得分:1)

有时候,问题是您希望LinearLayout为垂直方向,但是如果您未将其设置为Vertical,则LinearLayout默认为水平方向,如果已经有一个具有匹配父级宽度的项目,则您将不会看到其他项目。

答案 2 :(得分:0)

// try this
**main.xml**
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="5dp"
    android:orientation="vertical">
</LinearLayout>

**your_layout.xml**
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
    <TextView
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:id="@+id/a_text_view"/>
</LinearLayout>

**MyActivity**
public class MyActivity extends Activity  {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        View v = LayoutInflater.from(this).inflate(R.layout.your_layout, null);
        TextView textView = (TextView) v.findViewById(R.id.a_text_view);
        textView.setText("your text");
        addContentView(v, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT));
    }
}

答案 3 :(得分:0)

那是因为父母的观点已经衡量了她的孩子。如果您在测量后添加视图,则应致电

View.invalidate()

还要确保子视图的可见性为View.visible并且view bounds不为0;

答案 4 :(得分:0)

几年后,您问了这个问题:)在您读完最后一条评论后,我意识到了这个问题:“我应该为哪个视图调用invalidate()?我需要在异步任务中运行addView函数。例如View.invalidate ();哪个视图?– Pradeep Mittal 13年10月26日在5:41“

您的问题如下。您正在尝试在运行异步任务后插入那些视图。为此,您必须位于UI线程上,永远不要从另一个线程(如UI线程)访问视图。

尝试将您在UI上执行的所有操作包装到

runOnUiThread(new Runnable() {
    @Override
    public void run() { ... code changing the UI ... }
});

因此,尝试像这样更改onPreExecute:

@Override
protected void onPreExecute() {
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            // fill in any details dynamically here 
            TextView textView = (TextView) v.findViewById(R.id.siz);
            textView.setText("your text");
            // insert into main view 
            addContentView(v, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));

            // maybe this will be needed too: getView().invalidate();
        }
    });

    super.onPreExecute();
}

也许您也需要getView()。invalidate()。

虽然我没有尝试,但是如果有帮助,请给我反馈。