레이아웃 XML을 통해 사용자 지정보기를 추가 한 다음 응용 프로그램의 다른 위치에 콜백을 첨부하려고 할 때 같은 문제가 발생했습니다.
사용자 정의보기를 작성하여 "layout_main.xml"에 추가했습니다.
public class MUIComponent extends SurfaceView implements SurfaceHolder.Callback {
public MUIComponent (Context context, AttributeSet attrs ) {
super ( context, attrs );
}
// ..
}
그리고 메인 액티비티에서 콜백을 첨부하고 XML에서 UI 요소에 대한 참조를 얻고 싶었습니다.
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는 레이아웃을 확장하고 확장 된 레이아웃을 사용하여 조회를 수행합니다.