2013-08-29 85 views
16

我已經編寫了自定義視圖,並且想要在與我的自定義視圖交互之後更新一些其他視圖。自定義視圖中的Android findViewById()

主要佈局:

<?xml version="1.0" encoding="utf-8"?> 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:custom="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <EditText 
     android:id="@+id/display_name" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:inputType="text" 
     android:layout_centerHorizontal="true" 
     android:tag="name" 
     android:ems="10" /> 

    <EditText 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:inputType="number" 
     android:ems="10" 
     android:id="@+id/id_number" 
     android:layout_centerHorizontal="true" 
     android:layout_below="@id/display_name"/> 

    <ge.altasoft.custom_views.IdNumber 
     android:id="@+id/custom_id_number" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerHorizontal="true" 
     android:layout_below="@id/id_number" 
     android:paddingLeft="35dip" 
     custom:firstName="@id/display_name"/> 
</RelativeLayout> 

自定義視圖佈局:

<?xml version="1.0" encoding="utf-8"?> 

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"> 

    <EditText 
     android:id="@+id/id_number_custom" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:inputType="number" 
     android:ems="10" 
     android:paddingRight="35dip" /> 

    <ImageButton 
     android:id="@+id/load_data_button" 
     android:layout_width="30dip" 
     android:layout_height="30dip" 
     android:layout_centerVertical="true" 
     android:src="@drawable/load_data" 
     android:layout_toRightOf="@id/id_number_custom" /> 

</RelativeLayout> 

自定義視圖類,構造函數和聽衆:

private int firstNameViewID; 

public IdNumber (Context context, AttributeSet attrs) { 
     super(context, attrs); 
     initViews(); 

     TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.IdNumber); 
     final int N = a.getIndexCount(); 
     for(int i = 0; i < N; i++){ 
      int attr = a.getIndex(i); 
      switch(attr){ 
       case R.styleable.IdNumber_firstName: 
        firstNameViewID = a.getResourceId(attr, -1); 
        break; 
      } 
     } 
     a.recycle(); 
    } 



private void initViews() { 
     inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     inflater.inflate(R.layout.id_number_edit_text_custom, this, true); 
     editText = (EditText) findViewById(R.id.id_number_custom); 
     loadButton = (ImageButton) findViewById(R.id.load_data_button); 
     loadButton.setVisibility(RelativeLayout.INVISIBLE); 
     loadData(); 
    } 

private void loadData(){ 
     loadButton.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       EditText firstName = (EditText) findViewById(R.id.display_name); 
       firstName.setText("Some Text"); 
      } 
     }); 
    } 

問題是EditText firstName = (EditText) findViewById(R.id.display_name);返回null。 我知道,只是調用findViewById()將在我膨脹它的佈局中搜索視圖。

如果可能的話,我如何從主佈局中獲得ID爲:display_name的EditText視圖?

在此先感謝。

+0

不,我不想得到我的自定義視圖,我想從id爲diplay_name的mainLayout獲取其他視圖。 – Jilberta

+0

你膨脹的XML但不存儲返回的視圖。您可以在該視圖上按ID查找視圖。 – Siddhesh

回答

11
View Custmv; 

private void initViews() { 
     inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     Custmv = inflater.inflate(R.layout.id_number_edit_text_custom, this, true); 
     editText = (EditText) findViewById(R.id.id_number_custom); 
     loadButton = (ImageButton) findViewById(R.id.load_data_button); 
     loadButton.setVisibility(RelativeLayout.INVISIBLE); 
     loadData(); 
    } 

private void loadData(){ 
     loadButton.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       EditText firstName = (EditText) Custmv.getParent().findViewById(R.id.display_name); 
       firstName.setText("Some Text"); 
      } 
     }); 
    } 

試試這個。

+0

你沒有得到它@Siddesh, editText =(EditText)findViewById(R.id.id_number_custom); loadButton =(ImageButton)findViewById(R.id.load_data_button); 這工作得很好,我可以從CustomView佈局中獲取視圖,我想從MainLayout獲取視圖。 – Jilberta

+0

好的,但爲什麼你想處理自定義視圖類的主佈局? – Siddhesh

+0

,因爲我想在與自定義視圖交互之後更新這些視圖。 – Jilberta

1

更改方法如下,並檢查它的工作

private void initViews() { 
     inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     inflater.inflate(R.layout.id_number_edit_text_custom, this, true); 
View view = (View) inflater.inflate(R.layout.main, null); 
     editText = (EditText) view.findViewById(R.id.id_number_custom); 
     loadButton = (ImageButton)view. findViewById(R.id.load_data_button); 
     loadButton.setVisibility(RelativeLayout.INVISIBLE); 
     loadData(); 
    } 
+0

我試過這個Usman,但它不起作用,視圖返回null。 – Jilberta

+0

當LayoutInflater.inflate返回View時,不需要轉換爲View。 – vilpe89

0

如果它是固定的佈局,你可以做這樣的:

public void onClick(View v) { 
    ViewGroup parent = (ViewGroup) IdNumber.this.getParent(); 
    EditText firstName = (EditText) parent.findViewById(R.id.display_name); 
    firstName.setText("Some Text"); 
} 

如果你想找到的EditText在靈活的佈局,我會以後幫助你。希望這個幫助。

+0

父項爲空,只要我膨脹自定義視圖所代表的佈局。 – Jilberta

0
@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View row = convertView; 
    ImageHolder holder = null; 
    if (row == null) { 
     LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
     row = inflater.inflate(layoutResourceId, parent, false); 
     holder = new ImageHolder(); 
     editText = (EditText) row.findViewById(R.id.id_number_custom); 
     loadButton = (ImageButton) row.findViewById(R.id.load_data_button); 
     row.setTag(holder); 
    } else { 
     holder = (ImageHolder) row.getTag(); 
    } 


    holder.editText.setText("Your Value"); 
    holder.loadButton.setImageBitmap("Your Bitmap Value"); 
    return row; 
} 
+1

我想你在這裏回答一些其他問題。 。 。 – Jilberta

+0

如果你得到像空指針一樣的錯誤,那麼你的編輯文本和圖像按鈕的初始化會出錯,因爲你的代碼... –

+0

沒有問題不在editText中,也沒有在imageButton – Jilberta

0

在構造函數試試這個

MainActivity maniActivity = (MainActivity)context; 
EditText firstName = (EditText) maniActivity.findViewById(R.id.display_name); 
0

你可以嘗試這樣的事情:

內customview構造:

內customview
mContext = context; 

接下來,您可以撥打:

((MainActivity) mContext).updateText(text); 

MainAcivity定義:

public void updateText(final String text) { 

    TextView txtView = (TextView) findViewById(R.id.text); 
    txtView.setText(text); 
} 

這對我的作品。

+0

多次調用findViewById()效率不高。如果您要重複使用它,請在「final」字段中存儲對其的引用。 –

相關問題