7

我正在使用以下代码在其子 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 将当前显示窗口转移到第二个选项卡。

第二个标签的代码:

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);
            }
        }
    }
}
4

5 回答 5

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);

希望这会帮助你。

于 2013-10-26T05:37:06.377 回答
1

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

于 2020-01-08T21:19:39.113 回答
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));
    }
}
于 2013-10-26T05:27:13.060 回答
0

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

查看.invalidate()

还要确保子视图可见性是否View.visibleview bounds0;

于 2020-01-08T22:27:24.843 回答
0

在你问这个问题几年后 :) 在阅读了你的最后一条评论后,我意识到了这个问题:“我应该为哪个视图调用 invalidate()?我需要在异步任务中运行 addView 函数。就像 View.invalidate();哪种观点?——Pradeep Mittal 2013 年 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() 。

不过我没有尝试过,所以如果有帮助,请给我反馈。

于 2020-04-09T21:55:23.790 回答