カスタムビューを作成しました。カスタムビューを操作した後、他のいくつかのビューを更新します。
メインレイアウト:
_<?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のビューを取得するにはどうすればよいですか?
前もって感謝します。
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");
}
柔軟なレイアウトでEditTextを見つけたい場合は、後でお手伝いします。この助けを願っています。
@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;
}
次のようなものを試すことができます:
カスタムビューコンストラクター内:
mContext = context;
次にカスタムビュー内で呼び出すことができます:
((MainActivity) mContext).updateText( text );
MainAcivity
内で定義:
public void updateText(final String text) {
TextView txtView = (TextView) findViewById(R.id.text);
txtView.setText(text);
}
わたしにはできる。
あなたのコンストラクタでこれを試してください
MainActivity maniActivity = (MainActivity)context;
EditText firstName = (EditText) maniActivity.findViewById(R.id.display_name);