2015-04-23 7 views
0

У меня есть пользовательская кнопка с настраиваемым свойством XML string watch_enable, которое является именем EditText. В конструкторе кнопки я хочу прочитать это свойство и получить EditText с этим именем.Разметка активности надувания в конструкторе пользовательских представлений

Я использую мои пользовательские кнопки, как:

<EditText 
    android:id="@+id/edit_login_password" 
    android:inputType="textPassword" 
    android:text=""/> 

<my.project.widgets.WatchingButton 
    android:text="Enter" 
    app:watch_enable="edit_login_password"/> 

И это класс моей кнопки:

public WatchingButton(Context context, AttributeSet attrs) { 

    super(context, attrs); 
    TypedArray attributes = context.obtainStyledAttributes(attrs, R.styleable.WatchingButton); 
    for (int i = 0; i < attributes.getIndexCount(); i++) { 

     int attribute = attributes.getIndex(i); 
     if (attribute == R.styleable.WatchingButton_watch_enable) { 

      String value = attributes.getString(attribute); //<-- OK, value is edit_text_username 
      int idEdittext = context.getResources().getIdentifier(value, "id", context.getPackageName()); //<-- OK, I obtain the resource ID 
      Activity activity = (Activity) context; 
      EditText et = (EditText)((Activity)context).findViewById(idEditText); //<-- Error. et is null. 
      //DO STUFF 
     } 
    } 
} 

Я предполагаю, что деятельность еще не завышены, и я не могу получить вид на от него. Что я могу сделать?

Спасибо.

+0

Пожалуйста, покажите ошибку вы получаете –

+0

Просто я не могу EditText 'et', вместо этого я получаю нуль. –

+0

'WatchingButton extends Button' или' WatchingButton extends View' или 'WatchingButton расширяет ViewGroup'? –

ответ

1

решаемые !! Прежде всего, спасибо всем за ответ.

Во-первых, я сделал то, что сказал Ankit Bansal, ссылочный вид на @id вместо имени.

<com.grupogimeno.android.hoteles.widgets.WatchingButton 
      android:text="Enter" 
      app:watch_enable="@id/edit_login_password"/> 

Как я, хотя, я не мог получить вид на родительском компоновщик в конструкторе beacuse этой схемы еще не полностью накачан. Поэтому я сохраняю значение watch_enable в переменной.

public WatchingButton(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     TypedArray attributes = context.obtainStyledAttributes(attrs, R.styleable.WatchingButton); 
     this.id = attributes.getResourceId(R.styleable.WatchingButton_watch_enable, 0); 
} 

Затем, когда раскладка полностью надувается onAttachedToWindow метод вызывается во всех его взглядов, так что я получить EditText здесь:

@Override 
    protected void onAttachedToWindow() { 
     super.onAttachedToWindow(); 
      EditText et = (EditText)((Activity)getContext()).findViewById(this.id);//<-- OK 
     //DO STUFF 
     } 
    } 
1

Вместо использования String для изготовления ID app:watch_enable="edit_login_password"Reference использовать и передавать app:watch_enable="@id/edit_login_password", который даст вам целое значение идентификатора, на который ссылается.

1

Попробуйте также ПОЛУЧИТЬ родительском зрения WatchingButton зрения:

ViewGroup parentView = (ViewGroup)WatchingButton.this.getParent(); 
EditText et = (EditText)parentView.findViewById(idEditText); 
Смежные вопросы