首页 > 解决方案 > Android Studio:以编程方式实例化水平线性布局不起作用

问题描述

终于找到了一个解决方法:我决定只使用一个单行表,然后将stretchAllColumns 设置为true。这意味着它只是模仿具有展开视图的水平布局。

我试图在运行时实例化一个水平线性布局,我希望布局中的元素沿着布局的整个宽度展开。我还希望一切都中心垂直对齐。这是我目前所拥有的:

LinearLayout tertiaryLinearLayout = new LinearLayout(getActivity());
tertiaryLinearLayout.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
tertiaryLinearLayout.setOrientation(LinearLayout.HORIZONTAL);
tertiaryLinearLayout.setGravity(Gravity.FILL_HORIZONTAL);

这会实例化布局,但其中的元素没有正确填充它的整个宽度。我也不确定如何在不将 setGravity 更改为

tertiaryLinearLayout.setGravity(Gravity.CENTER_VERTICAL);

这个 TextView 是我添加到布局中的五个元素之一:

TextView dash = new TextView(getActivity());
dash.setText("-");

其中两个元素是 ImageViews,另外三个是 TextViews。这是它目前的样子: https ://i.stack.imgur.com/MGLyJ.jpg

编辑:
整体结构是具有垂直线性布局的 ScollView。此 LinearLayout 包含许多其他垂直 LinearLayout,每个都有一个水平 LinearLayout。希望这是有道理的。
的父视图在tertiaryLinearLayout这里:

LinearLayout secondaryLinearLayout = new LinearLayout(getActivity());
secondaryLinearLayout.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));
secondaryLinearLayout.setOrientation(LinearLayout.VERTICAL);
...
secondaryLinearLayout.addView(tertiaryLinearLayout);

编辑2:这是我的完整代码:

...
final LinearLayout linearLayout = root.findViewById(R.id.leagueLinearLayout);

List<Game> currentYearCategory = MainActivity.yearCategories.get(0);
for (int i = 0; i < currentYearCategory.size(); i++) {
    TextView textView = new TextView(getActivity());
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
    textView.setLayoutParams(params);
    textView.setText(currentYearCategory.get(i).date);
    linearLayout.addView(textView);
}
seekBarChange(linearLayout, root, 0);

// Set up seek bar
SeekBar yearSeekBar = root.findViewById(R.id.yearSeekBar);
yearSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        seekBarChange(linearLayout, root, progress);
    }

...
...

private void seekBarChange(LinearLayout linearLayout, View root, int progress){
    TextView yearTextView = root.findViewById(R.id.yearTextView);
    String newText = (1890 + progress * 10) + " - " + (1899 + progress * 10);
    yearTextView.setText(newText);

    final List<Game> currentYearCategory = MainActivity.yearCategories.get(progress);

    linearLayout.removeAllViews();
    for (int i = 0; i < currentYearCategory.size(); i++) {
        // Create views
        LinearLayout secondaryLinearLayout = new LinearLayout(getActivity());
        secondaryLinearLayout.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));
        secondaryLinearLayout.setOrientation(LinearLayout.VERTICAL);

        View separatorView = new View(getActivity());
        separatorView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 50));

        TextView date = new TextView(getActivity());
        date.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
        date.setText(currentYearCategory.get(i).date);

        LinearLayout tertiaryLinearLayout = new LinearLayout(getActivity());
        tertiaryLinearLayout.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));
        tertiaryLinearLayout.setOrientation(LinearLayout.HORIZONTAL);
        tertiaryLinearLayout.setGravity(Gravity.CENTER_VERTICAL);

        ImageView homeImage = new ImageView(getActivity());
        homeImage.setLayoutParams(new ViewGroup.LayoutParams(150, 150));
        if (currentYearCategory.get(i).celticIsHome){
            homeImage.setBackgroundResource(R.drawable.celtic_logo);
        } else {
            homeImage.setBackgroundResource(R.drawable.rangers_logo);
        }

        TextView homeScore = new TextView(getActivity());
        homeScore.setText(currentYearCategory.get(i).fullTimeScore.substring(0, 1));

        TextView dash = new TextView(getActivity());
        dash.setText("-");

        TextView awayScore = new TextView(getActivity());
        awayScore.setText(currentYearCategory.get(i).fullTimeScore.substring(2));

        ImageView awayImage = new ImageView(getActivity());
        awayImage.setLayoutParams(new ViewGroup.LayoutParams(150, 150));
        if (currentYearCategory.get(i).celticIsHome){
            awayImage.setBackgroundResource(R.drawable.rangers_logo);
        } else {
            awayImage.setBackgroundResource(R.drawable.celtic_logo);
        }

        // Add views
        tertiaryLinearLayout.addView(homeImage);
        tertiaryLinearLayout.addView(homeScore);
        tertiaryLinearLayout.addView(dash);
        tertiaryLinearLayout.addView(awayScore);
        tertiaryLinearLayout.addView(awayImage);

        secondaryLinearLayout.addView(separatorView);
        secondaryLinearLayout.addView(date);
        secondaryLinearLayout.addView(tertiaryLinearLayout);

        final int gameNum = i;
        secondaryLinearLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                openGameActivity(currentYearCategory, gameNum);
            }
        });
        linearLayout.addView(secondaryLinearLayout);
    }
}

任何帮助将不胜感激,谢谢!

标签: javaandroidandroid-layoutdynamicandroid-linearlayout

解决方案


我猜想将添加到的PARENT视图是针对. 尝试使其宽度。您应该在 2:52 秒查看本教程tertiaryLinearLayoutwrap_contentlayout_widthmatch_parent


推荐阅读