Написание пользовательских LinearLayout для Android - PullRequest
1 голос
/ 26 июля 2010

У меня есть пользовательский макет, который рисует прозрачный скругленный прямоугольник под дочерними элементами. Проблема в том, что когда я пытаюсь добавить его в свой XML-файл, он не отображается. Кроме того, когда я пытаюсь добавить к нему параметры (т.е. android:layout_width), всплывающее окно показывает, что ни один из них не доступен. То же самое происходит с любыми дочерними представлениями, которые я добавляю. Кто-нибудь может помочь?

public class RoundRectLayout extends LinearLayout 
{ 
 private RectF shape;
 public RoundRectLayout(Context context)
 {
  super(context);
  LayoutInflater layoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  layoutInflater.inflate(R.layout.settings, this);
  shape = new RectF();
 }

 public RoundRectLayout(Context context, AttributeSet attrs)
 {
  super(context, attrs);
  LayoutInflater layoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  layoutInflater.inflate(R.layout.settings, this);
  shape = new RectF();
 }

 @Override
 protected void onSizeChanged(int w, int h, int oldw, int oldh)
 {
  shape = new RectF(0, 0, w - 5, h - 5);
  super.onSizeChanged(w, h, oldw, oldh);
 }

 @Override
 protected void dispatchDraw(Canvas canvas)
 {
  Paint temp = new Paint();
  temp.setAlpha(125);
  canvas.drawRoundRect(shape, 10f, 10f, temp);
  super.dispatchDraw(canvas);
 }
}

Ответы [ 3 ]

8 голосов
/ 27 июля 2010

Если вам нужен просто прямоугольник с закругленными углами для вашего LinearLayout, вы можете определить нарисованную фигуру в XML-файле в "res / drawable /":

<?xml version="1.0" encoding="UTF-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
    <solid android:color="#50000000"/>    
    <stroke android:width="3dp"
            android:color="#ffffffff"/>
    <padding android:left="5dp"
             android:top="5dp"
             android:right="5dp"
             android:bottom="5dp"/> 
    <corners android:bottomRightRadius="7dp"
             android:bottomLeftRadius="7dp" 
             android:topLeftRadius="7dp"
             android:topRightRadius="7dp"/> 
</shape>

Затем вы устанавливаете фон макета наимя вашего нарисованного XML-файла.Если вы назвали его round_border.xml, установите фон на:

<LinearLayout
   android:background="@drawable/round_border"
   ...

Прозрачность устанавливается следующим образом ...

<solid android:color="#50000000"/>    

Первые 2 цифры означают прозрачность, последние 6 цифрэто цвет.

1 голос
/ 25 ноября 2011

Этот туто действительно помог мне с твоей проблемой

Прежде всего, вам нужно определить поля, которые вы хотите передать в ваш пользовательский макет, в файле res / values ​​/ attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
     <declare-styleable name="MyLayout">
        <attr name="text" format="string" />
    </declare-styleable>
</resources>

Теперь подготовьте ваш конструктор к получению этих атрибутов

public RoundRectLayout(Context context, AttributeSet attrs) {
    super(context, attrs);

    TypedArray a = context.obtainStyledAttributes(attrs,
            R.styleable.MyLayout);
    CharSequence s = a.getString(R.styleable.RoundRectLayout_text);
    if (s != null) {
        mText = s.toString();
    }
    a.recycle();
}

Затем добавьте пространство имен в файл layout.xml, чтобы пользователи Android могли найти ваш пользовательский макет. «mi.pakage» - это пакет java, в котором находится ваш пользовательский макет.

Если у вас есть пространство имен и класс, просто вызовите атрибуты, которые вы установили в attrs.xml

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:myapp="http://schemas.android.com/apk/res/mi.pakage"
    android:id="@+id/root"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#fff">

    <com.example.MyLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" 
        myapp:text="My Special Text String"/>

</RelativeLayout>

Но если вы просто хотите нарисовать прямоугольник, вы можете использовать метод sugested в другом ответе

0 голосов
/ 10 августа 2010

Я думаю, что это плагин, который не работает, но вы можете указать android: layout_ *, он будет принят во внимание. В любом случае, если вы просто хотите нарисовать прямоугольный макет, следуйте инструкциям Марко

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...