繁体   English   中英

如何以编程方式将TextView添加到布局?

[英]How to add the TextView to the layout programmatically?

我正在尝试使消息像在messenger 他们必须一个接一个地出现。 因此,我使用LinearLayout并将TextView添加到其中。 但是一下子出现。 我使用了循环,但看起来不起作用! 这是代码

final LinearLayout lm = (LinearLayout) findViewById(R.id.line_layout);
final LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.FILL_PARENT,
                LinearLayout.LayoutParams.WRAP_CONTENT
        );
        params.setMargins(10, 10, 500, 50);
        int i = 0;
        for (final Task task : tasks) {
            i = i + 1;

            for (int j = 0; j < 1; j++) {

                final TextView message = new TextView(TaskActivity.this);

                message.setText(task.getName());
                message.setId(task.getId());
                message.setLayoutParams(params);
                message.setTextSize(30);


                message.setBackground(getApplicationContext().getDrawable(R.drawable.task_text));

                Toast.makeText(TaskActivity.this, "Text loaded",
                        Toast.LENGTH_SHORT).show();


                lm.addView(message);
                SystemClock.sleep(1000);

            }

        }

无论计时器如何, TextViews都会立即显示。 该应用程序在定时器等待循环的每个循环时立即返回孔messengers

查看该应用程序的屏幕截图:

那么,您将如何执行此任务并解决问题? 谢谢!

如果您想要像Messenger中那样的行为,则应在android中使用RecyclerView。 https://developer.android.com/guide/topics/ui/layout/recyclerview在添加新消息的时间间隔内,您可以使用recyclerview notify方法显示新消息。

定义一个布局,您需要在其中添加textView,然后执行以下操作

LayoutParams lparams = new LayoutParams(
   LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

TextView tv=new TextView(this);

tv.setLayoutParams(lparams);

tv.setText("test");

this.parentLayout.addView(tv);

您的代码在uiThread上运行,因此UI在循环完成之前不会更新。 看一下使用AsyncTask在后台暂停应用程序,并在完成后进行更新。 尝试这样的事情:

public class TestActivity extends Activity
{

    Queue<String> messages = new LinkedList<String>();

    class PushNextMessage extends AsyncTask<Void, Void, Void>
    {


        @Override
        protected Void doInBackground(Void... params)
        {
            try
            {
                Thread.sleep(1000);
            }
            catch (Exception ex)
            {
                ex.printStackTrace();
            }
            return null;
        }

        @Override
        protected  void onPostExecute(Void _void)
        {
            String message = messages.remove();

            //this is where you add the view to the base layout

            if (messages.size() > 0)
            {
                new PushNextMessage().execute();
            }
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);

        messages.add("message 1");
        messages.add("message 2");
        messages.add("message 3");

        new PushNextMessage().execute();

    }


}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM