【问题标题】:android absolute layoutandroid绝对布局
【发布时间】:2011-09-18 15:49:37
【问题描述】:

我有一个复杂的时间表来使用TextViews 进行布局。我看到绝对布局已经贬值了。现在我知道这是“不好的做法”,但我有一个格式良好的屏幕指标类,可以调整与屏幕尺寸/密度等相关的所有内容。

如果我不能使用绝对布局,那么我如何告诉TextView 我非常想要它的左上角? (就像在 HTML 中使用绝对位置一样)?

我想不使用 XML 以编程方式执行此操作。这是可能的还是我必须使用WebView 或画布?

编辑::

    void positionView (TextView v, int x, int y, int w, int h){
    final ViewGroup.MarginLayoutParams lpt = new ViewGroup.MarginLayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);//v.getLayoutParams();
    //lpt.setMargins(x,y,x+w,y+h);
    lpt.height=h;
    lpt.width=w;
    lpt.topMargin=y;
    lpt.leftMargin=x;
    v.setLayoutParams(lpt);

}

这是我从这个快速测试代码中调用的方法:

        ScrollView dayViewContainer = new ScrollView(context);
    dayViewContainer.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
    FrameLayout dayView = new FrameLayout(context);
    dayView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
    dayView.setBackgroundColor(0xFF00FF00)
    int lineHeight = 60;

    for(int i =0;i<11 ;i++){
        TextView hourView = new TextView(context);
        hourView.setText(""+i+":00");
         BrScreenMetrics.getScreenWidthPX()-20, lineHeight);
        positionView(hourView, 50, i*lineHeight, BrScreenMetrics.getScreenWidthPX()-20, lineHeight);
        dayView.addView(hourView);
        }

    dayViewContainer.addView(dayView);
    addView(dayViewContainer);

【问题讨论】:

    标签: android layout absolute


    【解决方案1】:

    好吧,经过整整 24 小时的挠头,我终于为自己和其他人想出了一个答案:D 感谢大家,您的意见肯定让我朝着正确的方向前进!

    除非我遗漏了什么,否则框架布局中的边距基本上不能正常工作。所以我所做的是必须扩展一个完全扩展的线性布局,并在其中添加所需的视图。

    例如:

    public class BrPositionableTextView extends LinearLayout{
    
    TextView text ;
    
    public BrPositionableTextView(Context context, int x, int y, int w, int h) {
        super(context);
    
        setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
        text = new TextView(context);
        text.setHeight(h);
        text.setGravity(Gravity.CENTER_VERTICAL); 
        LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        params.setMargins(x, y, 0, 0);
        params.height = h;
        params.width = w;
        addView(text, params);
    }
    
    /**
     * @return the text
     */
    public String getText() {
        return text.getText().toString();
    }
    
    /**
     * @param text the text to set
     */
    public void setText(String text) {
        this.text.setText(text);
    }
    
    public void setMargins(int x, int y, int w, int h) {
        //not tested, may need to recreate textview...
        LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        params.setMargins(x, y, x+w, y+h);
        text.setLayoutParams(params);
    }
    
    public void setBackgroundColor(int color)
    {
        text.setBackgroundColor(color);
    }
    

    }

    然后可以将其添加到 FrameLayout 并在正确的位置显示视图。

    例子:

            ScrollView dayViewContainer = new ScrollView(context);
        dayViewContainer.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
        FrameLayout dayView = new FrameLayout(context);
        dayView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
        dayView.setBackgroundColor(0xFF005000);
        dayView.setMinimumHeight(BrScreenMetrics.getScreenHeightMinusStatusBar());
        dayView.setMinimumWidth(BrScreenMetrics.getScreenWidthPX());
        int lineHeight = 60;
    
        for(int i =0;i<11 ;i++){
            BrPositionableTextView hourView = new BrPositionableTextView(
                    context, 
                    8, 
                    i*lineHeight, 
                    80, 
                    lineHeight);
    
            hourView.setText(""+(i+7)+":00");
    
            dayView.addView(hourView);
            BrPositionableSeparator separator = new BrPositionableSeparator(
                    context, 
                    80, 
                    (i*lineHeight)+((int)(lineHeight*0.5f)), 
                    BrScreenMetrics.getScreenWidthPX()-117, 
                    1);
    
            separator.setColor(0xFFFFFFFF);
            dayView.addView(separator);
    
        }
        BrPositionableTextView bigassBox= new BrPositionableTextView(context, 100,200,300,500);
        bigassBox.setBackgroundColor(0xFF0000FF);
        dayView.addView(bigassBox);
    
        dayViewContainer.addView(dayView);
        addView(dayViewContainer);
    }
    

    【讨论】:

      【解决方案2】:

      是的,您可以使用以下代码以编程方式执行此操作..

      TextView title = ((TextView)findViewById(R.id.default_panel_title))
      final ViewGroup.MarginLayoutParams lpt =(MarginLayoutParams)title.getLayoutParams();
      
      lpt.setMargins(0,lpt.topMargin,lpt.rightMargin,lpt.bottomMargin);
      
      title.setLayoutParams(lpt);
      

      【讨论】:

      • @Sujit 发布的这段代码非常适合您,您可以考虑使用 FrameLayout 作为绝对布局的替代方案。您可以从左上角开始设置边距,并且放置在 frameLayout 内的视图不相互依赖。它们是一个在另一个之上,因此它们可以重叠放置在您想要的任何位置等。
      • 不幸的是它没有用。我创建了一个框架视图并将边距添加到视图中,但它们只是保持在 0,0。我可能需要使用 webview,因为我已经浪费了一天的时间了/跨度>
      猜你喜欢
      • 1970-01-01
      • 2017-01-03
      • 2013-05-11
      • 2018-01-22
      • 2012-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多