通过匿名界面

时间:2016-08-12 21:13:38

标签: java android android-fragments interface

这可能吗?我一直在使用与onAttach()进行Fragment-Activity通信的标准方式,我想知道是否可以这样做:

MainActivity.java

// Create Dialog passing in callback
MyDialogFragment dialog = MyDialogFragment.newInstance(param, new MyDialogInterface) {
        @Override
        public void onSelected(DialogFragment dialog, String result) {

        }

        @Override
        public void onNotSelected(DialogFragment dialog) {

        }
    }

MyDialogFragment.java

// Execute callback
builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                myInterface.onNotSelected(MyDialogFragment.this);
            }
        })
        .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                myInterface.onSelected(MyDialogFragment.this, "WORKED");
            }
        });

这将允许我在显示Dialog的代码中维护一个线性逻辑流,而不是必须向Activity添加其他接口方法。

1 个答案:

答案 0 :(得分:1)

这可能是一个很好的解决方案,但由于ActivityFragment可以从已保存状态销毁并重新创建,因此此方案不可靠 - 在Fragment&#39之后; s重新创建将不会引用Fragment内的回调。

应该使用标准方案,包括将Activity转换为onAttach()中的回调接口,因为保证在onAttach()之后调用Fragment使用非空引用重新创建以封闭Activity。这非常不方便,但这是Android Framework本身的限制。

不涉及接口和转换的解决方法:

我试过很多变种"界面和铸造"您希望避免使用的方法,并且所有这些方法确实感到肮脏和繁琐,因此,现在,我使用EventBus来支持Fragment - 至 - Activity通信。一般方案是这样的(只显示相关部分):

的活动:

public class DemoActivity extends Activity {

    @Override
    protected void onStart() {
        super.onStart();
        EventBus.getDefault().register(this);
    }

    @Override
    protected void onStop() {
        super.onStop();
        EventBus.getDefault().unregister(this);
    }

    @Subscribe
    public void onDemoFragmentEvent(DemoFragment.DemoFragmentCallbackEvent event) {
        Toast.makeText(this, "Event in Fragment happened: " + event.getWhatHappened(), Toast.LENGTH_LONG).show();
    }
}

片段:

public class DemoFragment extends Fragment {

    /**
     * Objects of this class will be posted on EventBus if anything happens in this Fragment
     */
    public static class DemoFragmentCallbackEvent {

        private String mWhatHappened;

        public DemoFragmentCallbackEvent(String whatHappened) {
            mWhatHappened = whatHappened;
        }

        public String getWhatHappened() {
            return mWhatHappened;
        }
    }

    public void somethingHappened() {
        EventBus.getDefault().post(new DemoFragmentCallbackEvent("no interfaces and casting"));
    }

}