Saya mengalami masalah yang sama beberapa waktu yang lalu ketika saya menambahkan Tampilan kustom melalui XML tata letak dan kemudian mencoba memasang callback di tempat lain dalam aplikasi ...
Saya membuat tampilan kustom dan menambahkannya ke "layout_main.xml" saya
public class MUIComponent extends SurfaceView implements SurfaceHolder.Callback {
public MUIComponent (Context context, AttributeSet attrs ) {
super ( context, attrs );
}
// ..
}
Dan di Aktivitas utama saya ingin melampirkan beberapa callback dan mendapatkan referensi ke elemen UI dari 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);
}
}
Initilizer tidak melakukan sesuatu yang mewah tetapi perubahan apa pun yang dicoba dilakukan pada tampilan kustom (MUIComponent) atau elemen UI non-kustom lainnya tidak muncul dalam aplikasi.
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
// ...
}
}
Perbedaan antara "badInst" dan "goodInst" adalah:
- badInst menggunakan findViewByID Aktivitas
- goodInst memekarkan tata letak dan menggunakan tata letak yang diperbesar untuk melakukan pencarian