मैं थोड़ी देर पहले उसी मुद्दे पर भाग गया जब मैंने लेआउट XML के माध्यम से एक कस्टम दृश्य जोड़ा और फिर आवेदन में कहीं और कॉलबैक संलग्न करने की कोशिश की ...
मैंने एक कस्टम दृश्य बनाया और इसे मेरे "layout_main.xml" में जोड़ा
public class MUIComponent extends SurfaceView implements SurfaceHolder.Callback {
public MUIComponent (Context context, AttributeSet attrs ) {
super ( context, attrs );
}
// ..
}
और मुख्य गतिविधि में मैं कुछ कॉलबैक संलग्न करना चाहता था और एक्सएम से यूआई तत्वों के संदर्भ प्राप्त करना चाहता था।
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 कुछ भी फैंसी नहीं कर रहा था, लेकिन कस्टम दृश्य (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 लेआउट को फुलाता है और लुकअप करने के लिए फुले हुए लेआउट का उपयोग करता है