【问题标题】:How to have dynamically a fixed header with scrollable content in Android?如何在Android中动态地拥有一个带有可滚动内容的固定标题?
【发布时间】:2015-11-17 10:46:57
【问题描述】:

我以编程方式创建了一个RelativeLayout,其中包含一个按钮。我还创建了一个ScrollView,其中包含一个LinearLayout,其中有超过10 个TextViews。我想让RelativeLayout 顶部对齐并固定。当有人试图向下滚动时,我希望所有TextViews 都位于固定的RelativeLayout 后面。我希望该按钮始终可见。使用此代码,RelativeLayout 和按钮不会显示。我哪里错了?

相对布局(固定)
- 按钮
线性布局
- 滚动视图
- 文本视图
- + 其他 10 个文本视图
这是我的代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    final RelativeLayout relativeLayout = new RelativeLayout(this);
    RelativeLayout.LayoutParams relativeLayoutParams = new RelativeLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
    relativeLayout.setLayoutParams(relativeLayoutParams);
    this.setContentView(relativeLayout);

    final Button restartButton = new Button(this);
    restartButton.setText(R.string.restartButton);
    LinearLayout.LayoutParams buttonParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
    restartButton.setLayoutParams(buttonParams);
    relativeLayout.addView(restartButton);

    ScrollView scrollView = new ScrollView(this);
    this.setContentView(scrollView);

    final LinearLayout linearLayout = new LinearLayout(this);
    LinearLayout.LayoutParams linearLayoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
    linearLayout.setLayoutParams(linearLayoutParams);
    linearLayout.setOrientation(linearLayout.VERTICAL);
    scrollView.addView(linearLayout);

    TextView textView1 = new TextView(this);
    testTitle.setText(R.string.text_view1);
    linearLayout.addView(textView1);

    // + other 10 text views
}

谢谢!

【问题讨论】:

    标签: java android android-layout android-linearlayout android-scroll


    【解决方案1】:

    在您的代码中,您将 RelativeLayout 替换为 ScrollView。只需首先将一些 LinearLayout 设置为 contentView,然后通过 addView(relativeLayout) 将您的 RelativeLayout 放在那里,然后通过 addView(scrollView) 将您的 scrollView 放在那里

    编辑:

    你的新代码:

    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            final LinearLayout mainLinearLayout = new LinearLayout(this);
            LinearLayout.LayoutParams mainLinearLayoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
            mainLinearLayout.setLayoutParams(mainLinearLayoutParams);
            mainLinearLayout.setOrientation(LinearLayout.VERTICAL);
            this.setContentView(mainLinearLayout);
    
            final RelativeLayout relativeLayout = new RelativeLayout(this);
            RelativeLayout.LayoutParams relativeLayoutParams = new RelativeLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
            relativeLayout.setLayoutParams(relativeLayoutParams);
            mainLinearLayout.addView(relativeLayout);
    
            final Button restartButton = new Button(this);
            restartButton.setText(R.string.restartButton);
            LinearLayout.LayoutParams buttonParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
            restartButton.setLayoutParams(buttonParams);
            relativeLayout.addView(restartButton);
    
            ScrollView scrollView = new ScrollView(this);
            mainLinearLayout.addView(scrollView);
    
            final LinearLayout linearLayout = new LinearLayout(this);
            LinearLayout.LayoutParams linearLayoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
            linearLayout.setLayoutParams(linearLayoutParams);
            linearLayout.setOrientation(linearLayout.VERTICAL);
            scrollView.addView(linearLayout);
    
            TextView textView1 = new TextView(this);
            testTitle.setText(R.string.text_view1);
            linearLayout.addView(textView1);
    
            // + other 10 text views
        }
    

    编辑2:根据注释将第一个linearLayout重命名为mainLinearLayout

    【讨论】:

    • 关于您的代码,我将第一个 linearLayout 重命名为 mainLinearLayout,因为有 2 个布局同名。最后,完美运行。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-25
    • 1970-01-01
    • 2011-04-24
    • 2014-04-22
    • 1970-01-01
    • 2014-04-01
    相关资源
    最近更新 更多