2015-09-26 2 views
0

Мне нужна «кнопка», которая будет иметь фон текстуры и динамический текст. Конечный результат должен быть таким, но фон - это текстурированное изображение. Custom Button with Text: Я попытался использовать RelativeLayout с TextView внутри, но проблема в том, что результат CustomView не wrap_content по ширине/высоте.Android TextView с пользовательским фоном?

Вот custom_buttonXML:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:background="@drawable/custom_button_selector" 
    android:layout_height="match_parent"> 

    <TextView 
     android:id="@+id/tv" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:gravity="center" 
     android:layout_centerInParent="true" 
     /> 
</RelativeLayout> 

Вот Code:

public class CustomButton extends RelativeLayout { 

private LayoutInflater mInflater; 

private RelativeLayout mContainer; 

private TextView mTextView; 

public CustomButton(Context context) { 
    super(context); 
    mInflater = LayoutInflater.from(context); 
    customInit(context); 
} 

public CustomButton(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    mInflater = LayoutInflater.from(context); 
    customInit(context); 
} 

public CustomButton(Context context, AttributeSet attrs, int defStyleAttr) { 
    super(context, attrs, defStyleAttr); 
    mInflater = LayoutInflater.from(context); 
    customInit(context); 
} 

private void customInit(Context ctx) { 
    mContainer = (RelativeLayout) mInflater.inflate(R.layout.cutom_button_view, this, true); 

    mTextView = (TextView) mContainer.findViewById(R.id.tv); 
} 

public RelativeLayout getContainer() { 
    return mContainer; 
} 

public TextView getTextView() { 
    return mTextView; 
} 
} 

Это, как я использую его в данный момент, и это работает:

<com.myapp.views.CustomButton 
       android:id="@+id/btn" 
       android:layout_width="80dp" 
       android:layout_height="50dp"/> 

Но я хочу, чтобы использовать его как это (для динамического текста), и он не будет работать:

<com.myapp.views.CustomButton 
        android:id="@+id/btn" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"/> 

Это будет на самом деле простирается через весь экран, игнорируя правила компоновки. Если это решение - плохая идея, можете ли вы порекомендовать альтернативу, которая даст одинаковые результаты?

+1

что случилось с 'TextView.setBackground'? – pskink

+0

он просто не центрирует текст на изображении ... Мне нужно использовать прописку, но она ломается с динамической длиной текста. На самом деле ядром моей проблемы является динамическая длина текста :( – nightfixed

+1

Что не так с 'TextView.setGravity'? – pskink

ответ

0

Пользовательский файл макета:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/container" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="@drawable/my_background"> 

<TextView 
    android:id="@+id/tv" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerInParent="true" 
    android:gravity="center" /> 
</RelativeLayout> 

Нестандартная планировка Java:

public class CustomButton extends FrameLayout { 


private RelativeLayout mContainer; 

private TextView mTextView; 

public CustomButton(Context context) { 
    super(context); 
    customInit(context); 
} 

public CustomButton(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    customInit(context); 
} 

public CustomButton(Context context, AttributeSet attrs, int defStyleAttr) { 
    super(context, attrs, defStyleAttr); 
    customInit(context); 
} 

private void customInit(Context ctx) { 
    LayoutInflater.from(ctx).inflate(R.layout.custom_button_viewa, this, true); 
    mContainer = (RelativeLayout) findViewById(R.id.container); 
    mTextView = (TextView) findViewById(R.id.tv); 
} 

public RelativeLayout getContainer() { 
    return mContainer; 
} 

public TextView getTextView() { 
    return mTextView; 
} 
} 

Теперь можно использовать как:

<com.androidbolts.databindingsample.model.CustomButton 
     android:id="@+id/customButton" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 
1

Вам нужно Shape-файл для этого ..

попробуйте этот.

<shape android:shape="rectangle"> 
    <corners android:radius="56dp" /> 

    <solid android:color="Color Whaterver You Want" /> 

    <padding android:bottom="4dp" android:left="4dp" android:right="4dp" android:top="4dp" /> 
</shape> 

Поместите этот XML-файл в папку res/drawal.

теперь только в Ваше мнение передать этот атрибут ..

android:background="@drawable/your file name"

Hop он работает для вас ..

Смежные вопросы