2011年 01月 18日

Android の、こうであって欲しいところ:startActivityForResult のインターフェイス

なんかあの、startActivityForResult と onActivityResult による処理の分断感と、requestCode まわりの感じが気持ちわるくてしかたないので、以下のようなインターフェイスならいいのになあ……とよく思うんですが、こうなってないのはなんででしょうかね……

        startActivityForResult(intent, new ActivityResultHandler() {
            public void run (int resultCode, Intent data) {
                if (resultCode == RESULT_OK) {

                }
            }
        });

実装自体は簡単なんですが、Java は mix-in できないので使いにくいのですよね……

    interface ActivityResultHandler {
        void run (int resultCode, Intent data);
    }

    protected HashMap<Integer, ActivityResultHandler> mActivityResultHandlers = new HashMap<Integer, ActivityResultHandler>();
    protected void startActivityForResult(Intent intent, ActivityResultHandler handler) {
        int code = handler.hashCode();
        mActivityResultHandlers.put(code, handler);
        startActivityForResult(intent, code);
    }

    @Override
    protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
        ActivityResultHandler handler = mActivityResultHandlers.remove(requestCode);
        handler.run(resultCode, data);
    }