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()将search我充气它的布局中的视图。

如果可能的话,我怎样才能从主布局的id:display_name的EditText视图?

提前致谢。

Solutions Collecting From Web of "Android自定义视图中的findViewById()"

 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"); } }); } 

试试这个。

改变你的方法如下,并检查它将工作

 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(); } 

如果它是固定的布局,你可以这样做:

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

如果你想在灵活的布局中findEditText,我会在稍后帮你。 希望这个帮助。

 @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; } 

在你的构造函数中试试这个

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

你可以尝试这样的事情:

在customview构造函数里面:

 mContext = context; 

接下来在customview中,你可以调用:

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

内部MainAcivity定义:

 public void updateText(final String text) { TextView txtView = (TextView) findViewById(R.id.text); txtView.setText(text); } 

这个对我有用。