ฉันพบปัญหาเดียวกันในขณะที่ฉันเพิ่มมุมมองที่กำหนดเองผ่าน XML เค้าโครงแล้วพยายามแนบการโทรกลับที่อื่นในแอปพลิเคชัน ...
ฉันสร้างมุมมองที่กำหนดเองและเพิ่มลงใน "layout_main.xml" ของฉัน
public class MUIComponent extends SurfaceView implements SurfaceHolder.Callback {
public MUIComponent (Context context, AttributeSet attrs ) {
super ( context, attrs );
}
// ..
}
และในกิจกรรมหลักฉันต้องการแนบการเรียกกลับและรับการอ้างอิงถึงองค์ประกอบ UI จาก 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);
}
}
ตัวเริ่มต้นไม่ได้ทำอะไรแปลก ๆ แต่การเปลี่ยนแปลงใด ๆ ที่พยายามทำกับมุมมองแบบกำหนดเอง (MUIComponent) หรือองค์ประกอบ UI ที่ไม่ได้กำหนดเองอื่น ๆก็ไม่ปรากฏในแอปพลิเคชัน
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
// ...
}
}
ความแตกต่างระหว่าง "badInst" และ "goodInst" คือ:
- badInst ใช้ findViewByID ของกิจกรรม
- goodInst ขยายเค้าโครงและใช้เค้าโครงที่สูงเกินจริงเพื่อทำการค้นหา