2015-12-27 2 views
1

Я создал макет для формата кнопки, который я использую несколько раз. Формат кнопки имеет TextView и ImageView. Поскольку я включаю этот макет в свою основную деятельность, я не думаю, что я могу динамически изменять текст внутреннего TextView на Java или в XML. Есть ли другой способ сделать это, чтобы я мог установить текст внутреннего TextView?Настройка вложенного текста TextView

Планировка:

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


<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="25dp" 
    android:layout_marginTop="13dp" 
    android:textSize="20dp" 
    android:text="CHANGE ME" 
    android:id="@+id/text" /> 

<ImageView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="12dp" 
    android:layout_marginRight="25dp" 
    android:layout_alignParentRight="true" 
    android:src="@drawable/left" 
    android:adjustViewBounds="true" 
    android:scaleType="centerCrop" 
    android:maxHeight="30dp" 
    android:maxWidth="30dp"/> 
</RelativeLayout> 

Основная деятельность:

... 
<include layout="@layout/settings_layout" 
    android:layout_width="fill_parent" 
    android:layout_height="match_parent" 
    android:layout_below="@+id/accountStaticUnderline" 
    android:id="@+id/termBegin" 
    android:text="TEST" /> //DOESNT WORK 
... 
</RelativeLayout> 

ответ

1

Настройка текста таким образом выиграл» т, потому что android:text не применим к тегу <include>. Более конкретно, это не относится к включенной вещи, которая является RelativeLayout. (Вы не могли бы поставить android:text на RelativeLayout и он применяется к TextView, ни вы бы ожидать, что к работе.)

Мое первое предложение (и самый простой безотлагательного решения) является использование TextView «S построен в поддержка составных чертежей, чтобы вы могли просто использовать TextView s вместо include и иметь ресурс стиля для нужных вам атрибутов.

Если это не подходит для вашего случая использования, вам может потребоваться создать пользовательский вид. Этот вид заменит RelativeLayout и будет TextView и ImageView в качестве детей. Главное, чтобы решить, где и как создаются дети и их ссылки: вы можете создавать их вручную на Java, когда родитель строится; или вы можете использовать некоторую комбинацию макетов с <include> s и/или <merge> s. При создании текстового атрибута требуется некоторое использование <declare-styleable>.

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

public class MyButton extends RelativeLayout { 

    private TextView mTextView; 
    private ImageView mImageView; 

    public MyButton(Context context) { 
     super(context); 
     init(context, null); 
    } 

    public MyButton(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(context, attrs); 
    } 

    public MyButton(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     init(context, attrs); 
    } 

    public MyButton(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
     super(context, attrs, defStyleAttr, defStyleRes); 
     init(context, attrs); 
    } 

    private void init(Context context, AttributeSet attributeSet) { 
     LayoutInflater inflater = LayoutInflater.from(context); 
     inflater.inflate(R.layout.my_button, this, true); // used with merge tag 
     mTextView = (TextView) findViewById(R.id.text); 
     mImageView = (ImageView) findViewById(R.id.image); 

     int[] attrs = {android.R.attr.text}; 
     TypedArray a = context.obtainStyleAttributes(attributeSet, attrs); 
     String text = a.getString(0, null); 
     mTextView.setText(text); 
     a.recycle(); 
    } 
} 

В res/layout/my_button.xml:

<merge xmlns:android="http://schemas.android.com/apk/res/android"> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="25dp" 
     android:layout_marginTop="13dp" 
     android:textSize="20dp" 
     android:text="CHANGE ME" 
     android:id="@+id/text" /> 

    <ImageView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="12dp" 
     android:layout_marginRight="25dp" 
     android:layout_alignParentRight="true" 
     android:src="@drawable/left" 
     android:adjustViewBounds="true" 
     android:scaleType="centerCrop" 
     android:maxHeight="30dp" 
     android:maxWidth="30dp"/> 
</merge> 

В макете деятельности:

... 
<!-- no more include --> 
<com.package.MyButton 
    android:id="@+id/something" 
    android:layout_width="..." 
    android:layout_height="..." 
    android:text="..." /> 

<!-- you can have multiple instances with different IDs --> 
<com.package.MyButton 
    android:id="@+id/something_else" 
    android:layout_width="..." 
    android:layout_height="..." 
    android:text="..." /> 
... 

Вы также можете использовать свой собственный <declare-styleable> для пользовательского представления, которое будет необходимо, если в дальнейшем вы захотите иметь пользовательские XML-атрибуты для него, но этого подхода должно быть достаточно.

1

уверен, просто введите этот код в вашей деятельности

((TextView)findViewById(R.id.text)).setText("enter_text_here"); 
+0

Когда у меня есть несколько экземпляров этого макета в одном действии, как я могу различать их? – Nathan

+0

выглядит как плохая практика, добавляя несколько одинаковых макетов в один вид деятельности. Попробуйте что-нибудь еще. Например, добавьте кнопки programmaticaly и сохраните их в массиве. Вам лучше описать задачу, которую вы хотите заполнить, добавив несколько макетов, возможно, кто-нибудь даст вам советы, как справиться с этим правильно. –

+0

Его предназначение - это настраиваемый вид. Если мы можем использовать ' Nathan