Eu tive o mesmo problema há algum tempo, quando adicionei uma Visualização personalizada por meio do XML de layout e tentei anexar um retorno de chamada em outro lugar no aplicativo ...
Eu criei uma visualização personalizada e a adicionei ao meu "layout_main.xml"
public class MUIComponent extends SurfaceView implements SurfaceHolder.Callback {
public MUIComponent (Context context, AttributeSet attrs ) {
super ( context, attrs );
}
// ..
}
E na Activity principal, eu queria anexar alguns retornos de chamada e obter referências aos elementos da IU do 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);
}
}
O initilizer não estava fazendo nada extravagante, mas as alterações que tentava fazer na visualização personalizada (MUIComponent) ou em outros elementos de interface do usuário não personalizados simplesmente não apareciam no aplicativo.
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
// ...
}
}
A diferença entre "badInst" e "goodInst" é:
- badInst usa o findViewByID da Activity
- goodInst infla o layout e usa o layout inflado para fazer a pesquisa