Tôi đã gặp phải vấn đề tương tự một lúc trước khi tôi thêm Chế độ xem tùy chỉnh qua XML bố cục và sau đó cố gắng đính kèm một lệnh gọi lại ở nơi khác trong ứng dụng ...
Tôi đã tạo một chế độ xem tùy chỉnh và thêm nó vào "layout_main.xml" của mình
public class MUIComponent extends SurfaceView implements SurfaceHolder.Callback {
public MUIComponent (Context context, AttributeSet attrs ) {
super ( context, attrs );
}
// ..
}
Và trong Hoạt động chính, tôi muốn đính kèm một số lệnh gọi lại và nhận tham chiếu đến các phần tử giao diện người dùng từ 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);
}
}
Trình khởi tạo không làm bất cứ điều gì lạ mắt nhưng bất kỳ thay đổi nào mà nó cố gắng thực hiện đối với chế độ xem tùy chỉnh (MUIComponent) hoặc các phần tử giao diện người dùng không tùy chỉnh khác chỉ đơn giản là không xuất hiện trong ứng dụng.
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
// ...
}
}
Sự khác biệt giữa "badInst" và "goodInst" là:
- badInst sử dụng findViewByID của Activity
- goodInst làm phồng bố cục và sử dụng bố cục phồng để thực hiện tra cứu