【问题标题】:Android how to programmatically create scrollview and add programmatically created views into itAndroid如何以编程方式创建滚动视图并将以编程方式创建的视图添加到其中
【发布时间】:2013-06-18 21:25:58
【问题描述】:

好的,我正在尝试构建一个具有水平滚动视图的活动,用户可以通过滑动查看不同的“页面”。我的思路是这些“页面”会被浏览。以下是我的想法的模型(乱来看看它是否有效)

我对此进行了如下实验:

我的内容视图设置为滚动视图。 (不确定这是否是不正确的方法)

我创建了滚动视图,并按如下方式将视图放入其中:

private void setupScrollView()
{
    Display display = getWindowManager().getDefaultDisplay();
    DisplayMetrics outMetrics = new DisplayMetrics ();
    display.getMetrics(outMetrics);

    float density  = getResources().getDisplayMetrics().density;
    float dpHeight = outMetrics.heightPixels / density;
    float dpWidth  = outMetrics.widthPixels / density;

    int width = (int)MeasureUtils.convertDpToPixel(dpWidth, getApplicationContext());
    int height = (int)MeasureUtils.convertDpToPixel(dpHeight, getApplicationContext());

    _scrollView = new HorizontalScrollView(getApplicationContext());
    _scrollView.setBackgroundColor(Color.CYAN);
    _scrollView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

     Log.i("DEBUG", "Screen dp width = " + dpWidth + " screen dp height = " + dpHeight);

    TextView view = new TextView(getApplicationContext());
    view.setBackgroundColor(Color.RED);
    view.setText("TEST");

    view.setX(0); // Start at the left of the scrollview.

    view.setWidth(width); // Size it so that it fills to the right of the scrollview.

    TextView view2 = new TextView(getApplicationContext());
    view2.setBackgroundColor(Color.GREEN);
    view2.setText("TEST2");

    view2.setX(width); // Start the second "page/view" offscreen to the right where i can scroll to it

    view.setWidth(width); // Fill the screen width

    LinearLayout layout = new LinearLayout(getApplicationContext());
    layout.setBackgroundColor(Color.MAGENTA);

    layout.addView(view);

    layout.addView(view2);

    _scrollView.addView(layout);
}

上面的想法是,我将看到一个占据屏幕的视图,代表一个页面。此视图的颜色应为“红色”。然后我可以水平滚动到右侧并查看代表下一页的第二个视图 (view2)。此视图的颜色应为“绿色”。这不会发生。我最终看到屏幕的 1/3 或 1/2 看起来像是 view1,线性布局几乎占据了整个屏幕(与 CYAN 与滚动视图流血)。

我是不是以错误的方式处理这个问题,和/或是否有可能按照我的方式进行这项工作?

【问题讨论】:

    标签: android android-layout android-widget scrollview


    【解决方案1】:

    您可能不想使用水平滚动视图来创建“页面”。 试试看PageViewer

    这会自动为您构建所有 sywpe 和膨胀逻辑。

    基本上,您会接到一个电话来为某个页面充气。然后您可以在那里创建您的视图(如果您愿意,可以动态创建),然后返回要渲染的根。

    【讨论】:

    • 网页浏览器看起来不错,我可能会研究一下,因为它可能是一种更清洁的方法。不过,就目前而言,我只是想看看(如果你愿意的话,为了学习目的)是否可以按照我的方式行事。
    • 我确定它是某种原因,但您并没有“学习”以这种方式编写 Android 的正确方法。 LinearLayouts 有一个被调用的 onMeasure 函数,这可能就是您遇到调整大小问题的原因。您可以尝试使用 RelativeLayout 或框架作为基础,然后将滚动视图推入其中,但是....嗯。一般来说,滚动视图的问题在于决定什么是焦点(当你放置嵌套滚动视图时更是如此。永远不要这样做!)。
    • @FrankSposaro:它仍然被称为 ViewPager 而不是 PageViewer。这可能会让人们感到困惑。
    • 啊。很高兴我当时包含了一个链接
    【解决方案2】:

    好吧,我已经弄清楚我做错了什么,结果证明是一件非常小的事情......

    完整代码在这里:

        private void setupScrollView()
    {
        Display display = getWindowManager().getDefaultDisplay();
        DisplayMetrics outMetrics = new DisplayMetrics ();
        display.getMetrics(outMetrics);
    
        float density  = getResources().getDisplayMetrics().density;
        float dpHeight = outMetrics.heightPixels / density;
        float dpWidth  = outMetrics.widthPixels / density;
    
        int width = (int)MeasureUtils.convertDpToPixel(dpWidth, getApplicationContext());
        int height = (int)MeasureUtils.convertDpToPixel(dpHeight, getApplicationContext());
    
        _scrollView = new HorizontalScrollView(getApplicationContext());
        _scrollView.setBackgroundColor(Color.CYAN);
        _scrollView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
    
        Log.i("DEBUG", "Screen dp width = " + dpWidth + " screen dp height = " + dpHeight);
    
        TextView view = new TextView(getApplicationContext());
        view.setBackgroundColor(Color.RED);
        view.setText("TEST");
    
        view.setX(0);
    
        view.setWidth(width);
        view.setHeight(height - 50);
    
        TextView view2 = new TextView(getApplicationContext());
        view2.setBackgroundColor(Color.GREEN);
        view2.setText("TEST2");
    
        view2.setX(0);
    
        view2.setWidth(width);
        view2.setHeight(height - 50);
    
        LinearLayout layout = new LinearLayout(getApplicationContext());
        layout.setBackgroundColor(Color.MAGENTA);
    
        layout.addView(view);
    
        layout.addView(view2);
    
        _scrollView.addView(layout);
    
    
    }
    

    这会像我一样以编程方式创建一个水平滚动视图,但问题是我将第二个视图设置为“宽度”,而它应该设置为“0”,如下所示:

    view2.setX(0);
    

    这样,我在滚动视图中获得了 2 个类似于页面的“视图”,我可以在其中滑动浏览。每个都占据整个页面。

    讨厌关闭代码,这是我错过的一个简单修复:|

    希望这可以帮助其他尝试这样做的人。我将按照 Frank 的建议研究 PageViewer。

    【讨论】:

    • 很高兴你找到了它。现在旋转屏幕或尝试不同屏幕尺寸的设备。 :p
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多