J'ai écrit ma vue personnalisée et je souhaite mettre à jour d'autres vues après avoir interagi avec ma vue personnalisée.
Disposition principale:
<?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>
Disposition de vue personnalisée:
<?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>
Classe de vue personnalisée, constructeur et auditeur:
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");
}
});
}
Le problème est que EditText firstName = (EditText) findViewById(R.id.display_name);
renvoie null. Je sais que le simple fait d'appeler findViewById()
recherchera la vue dans la présentation qui l'a gonflée.
Si c'est possible, comment puis-je obtenir la vue de EditText avec l'id: nom_affichage depuis la présentation principale?
Merci d'avance.
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");
}
});
}
essayez comme ça.
Changez votre méthode comme suit et vérifiez que cela fonctionnera
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();
}
Si c'est la mise en page fixe, vous pouvez faire comme ça:
public void onClick(View v) {
ViewGroup parent = (ViewGroup) IdNumber.this.getParent();
EditText firstName = (EditText) parent.findViewById(R.id.display_name);
firstName.setText("Some Text");
}
Si vous voulez trouver le EditText dans une disposition flexible, je vous aiderai plus tard. J'espère que cette aide.
@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;
}
Vous pouvez essayer quelque chose comme ça:
Inside customview constructeur:
mContext = context;
Suivant dans customview, vous pouvez appeler:
((MainActivity) mContext).updateText( text );
Dans MainAcivity
définir:
public void updateText(final String text) {
TextView txtView = (TextView) findViewById(R.id.text);
txtView.setText(text);
}
Ça marche pour moi.
Essayez ceci dans votre constructeur
MainActivity maniActivity = (MainActivity)context;
EditText firstName = (EditText) maniActivity.findViewById(R.id.display_name);