Android абсолютное расположение - PullRequest
0 голосов
/ 20 июня 2011

У меня сложное расписание для макета с использованием TextViews.Я вижу, что абсолютное расположение было обесценено.Теперь я знаю, что это «плохая практика», но у меня есть хорошо сформированный класс метрик экрана, который будет корректировать все в зависимости от размера / плотности экрана и т. Д.

Если я не могу использовать абсолютный макет, как я могу сказатьTextView Я так сильно хочу оставить и сверху?(как в HTML с использованием абсолютной позиции)?

Я хочу сделать это программно, не используя XML.Это возможно или мне нужно использовать WebView или canvas?

EDIT ::

    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);

Ответы [ 2 ]

1 голос
/ 21 июня 2011

Хорошо, после целых 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);
}
1 голос
/ 20 июня 2011

Да, вы можете сделать это программно, используя следующий код ..

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...