以编程方式对齐视图

Posted

技术标签:

【中文标题】以编程方式对齐视图【英文标题】:Align views programmatically 【发布时间】:2016-03-29 20:03:57 【问题描述】:

我正在尝试以编程方式创建 contentView,但我无法理解为什么以下代码不能按我的意愿工作。代码如下:

public class UserProfile extends AppCompatActivity 
    ScrollView scrollView;
    LinearLayout contentnView;
    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        Intent intent = getIntent();
        ServerRequest serverRequest = new ServerRequest(this);
        final String userid = intent.getStringExtra(PostPopUp.EXTRA_USER_PROFILE_ID);
        serverRequest.getUserPostsInBackground(userid, new GetCallback() 
            @Override
            public void done(ArrayList<Document> docs) 
                contentnView = new LinearLayout(UserProfile.this);
                contentnView.setOrientation(LinearLayout.VERTICAL);
                setContentView(contentnView);
                RelativeLayout relativeLayoutWithView = new RelativeLayout(UserProfile.this);
                LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
                relativeLayoutWithView.setLayoutParams(params);
                relativeLayoutWithView.setPadding(16, 16, 16, 16);
                relativeLayoutWithView.setBackgroundColor(Color.WHITE);
                FacebookSdk.sdkInitialize(getApplicationContext());
                ProfilePictureView profilePictureView = new ProfilePictureView(UserProfile.this);
                profilePictureView.setProfileId(userid);
                profilePictureView.setId(View.generateViewId());
                final HashMap<Integer, View> lines = new HashMap<>();

                int i = 0;

                for (Document post : docs) 
                    lines.put(i, new View(UserProfile.this));
                    i++;
                
                RelativeLayout.LayoutParams paramsProfileImg = new RelativeLayout.LayoutParams(170, 170);
                paramsProfileImg.addRule(RelativeLayout.CENTER_HORIZONTAL, 1);              
                relativeLayoutWithView.addView(profilePictureView, paramsProfileImg);
                for (int j = 0; j < textViews.size(); j++) 
                    RelativeLayout.LayoutParams paramsLine = new RelativeLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 1);
                    if (j == 0) 
                        paramsLine.addRule(RelativeLayout.BELOW, profilePictureView.getId());
                     else 
                        paramsLine.addRule(RelativeLayout.BELOW, lines.get(j - 1).getId());                   
                    

                    paramsLine.setMargins(0, 16, 0, 0);
                    lines.get(j).setLayoutParams(paramsLine);
                    relativeLayoutWithView.addView(lines.get(j), paramsLine);
                
                scrollView = new ScrollView(UserProfile.this);
                scrollView.addView(relativeLayoutWithView);
                contentnView.addView(scrollView);
            
        );



    

我想要的是第一个视图(就像 hr btw 这样的一条线)在个人资料图片视图(它确实如此)下方对齐,而其他视图在另一个视图下方对齐。确实发生的是第一个视图在个人资料图片视图下方对齐,而所有其他视图都堆叠到屏幕的开头。

有什么想法吗?

.. serverRequest.getUserPostsInBackground 只是一个 AsynkTask

【问题讨论】:

【参考方案1】:

由于您使用的是相对布局,因此您应该在预先添加的视图下对齐您添加的每个新视图。 我认为您正在这样做我不确定,因为我不知道行字段用于(视图列表?),以防万一 - 尝试为每个新视图显式设置 id你创建,我怀疑它们都添加到顶部,因为 id 字段是 0 或类似的东西,所以你使用的布局参数是无用的(即它们都在视图下与 id -1 或 0 对齐,因为它们只到达那里完成创建整个视图的操作后的id)

【讨论】:

我刚刚发现我忘记将 ID 设置为 hashmap 值...无论如何感谢您的回答,这确实是问题所在! :) 有时复制粘贴您自己的代码可能会让人头疼! 我从 mongo db 获取文档,其中一个文档代表一个帖子,其中包含帖子正文、标题、图标等字段......所以我将所有这些值放在 hashmap 中,其中 hashmap 值为 (. ..) 像 ImageView、TextView 等这样的视图。这样,我在 hashmaps 中有我需要的东西,然后我在内容视图中布局它们。如果你愿意,我可以发布整个班级来查看它并告诉我我是否做错了/困难的方式 实际上在你这样说之后听起来很棒,我只是认为你正在使用哈希图来保留最后一个视图(这是一个巨大的矫枉过正......) 很高兴我们知道了 :) 感谢您的关注!

以上是关于以编程方式对齐视图的主要内容,如果未能解决你的问题,请参考以下文章

将右对齐约束添加到以编程方式添加的子视图

以编程方式对齐 Android 元素

使用不使用硬编码的 CGRect 和最小数量的约束以编程方式将堆栈视图与屏幕顶部对齐

以编程方式在 TextView 中设置文本对齐方式

Xamarin 以编程方式在底部形成垂直对齐图像

在 Swift 中以编程方式将 UIImageView 左右对齐