J'ai rencontré le même problème il y a quelque temps lorsque j'ai ajouté une vue personnalisée via le XML de mise en page, puis j'ai essayé de joindre un rappel ailleurs dans l'application ...
J'ai créé une vue personnalisée et l'ai ajoutée à mon "layout_main.xml"
public class MUIComponent extends SurfaceView implements SurfaceHolder.Callback {
public MUIComponent (Context context, AttributeSet attrs ) {
super ( context, attrs );
}
// ..
}
Et dans l'activité principale, je voulais attacher des rappels et obtenir des références aux éléments de l'interface utilisateur à partir du XML.
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// ...
MUIInitializer muiInit = new MUIInitializer();
muiInit.setupCallbacks(this);
muiInit.intializeFields(this);
}
}
L'initiateur ne faisait rien d'extraordinaire, mais les modifications qu'il tentait d'apporter à la vue personnalisée (MUIComponent) ou à d'autres éléments d'interface utilisateur non personnalisés n'apparaissaient tout simplement pas dans l'application.
public class MUIInitializer {
// ...
public void setupCallbacks ( Activity mainAct ) {
// This does NOT work properly
// - The object instance returned is technically an instance of my "MUICompnent" view
// but it is a *different* instance than the instance created and shown in the UI screen
// - Callbacks never get triggered, changes don't appear on UI, etc.
MUIComponent badInst = (MUIComponent) mainAct.findViewById(R.id.MUIComponent_TESTSURF);
// ...
// This works properly
LayoutInflater inflater = (LayoutInflater) mainAct.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View inflatedLayout = inflater.inflate ( R.layout.activity_main, null );
MUIComponent goodInst = (MUIComponent) inflatedLayout.findViewById(R.id.MUIComponent_TESTSURF);
// Add callbacks
// ...
}
}
La différence entre "badInst" et "goodInst" est:
- badInst utilise le findViewByID de l'activité
- goodInst gonfle la mise en page et utilise la mise en page gonflée pour faire la recherche