PreferenceFragment没有从应用结算请求中获取onActivityResult调用

rha*_*ter 1 android in-app-billing

我有一个首选项屏幕,向用户显示一个禁用广告的复选框.当用户首次点击此选项时,会向他们显示"应用内结算"购买选项以停用广告.

我在这里遇到的问题是我无法看到任何方法将onActivityResult回调到片段中.

所以我有一个PreferenceActivity加载PreferenceFragment(我似乎无法获得参考).在App Billing中,需要调用startIntentSenderForResultFragments不具有的活动.

当我启动购买流程时startIntentSenderForResult,onActivityResult会调用Activity ,但我需要在片段中使用它.

因为我使用以下内容将PreferenceFragment加载到PreferenceActivity中,所以我认为我不能获得对Fragment的引用来传递调用.

@Override
public void onBuildHeaders(List<Header> target) {
    loadHeadersFromResource(R.layout.preferences_headers, target);
}

@Override
public Intent getIntent() {
    final Intent modIntent = new Intent(super.getIntent());
    modIntent.putExtra(EXTRA_SHOW_FRAGMENT, SyncPreferencesFragment.class.getName());
    modIntent.putExtra(EXTRA_NO_HEADERS, true);
    return modIntent;
}
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?我不想分开我所有的购买逻辑,那么如何让我的Fragment onActivityForResult接听电话呢?

Dev*_*red 5

原始启动请求必须来自FragmentAndroid,以便将结果传回给相同的人Fragment.如果Activity启动请求,则结果本身并不会传递给Fragment可能附加到管理器的每个请求.除此之外,您还必须确保onActivityResult()在顶级中覆盖if Activity,同时调用super.onActivityResult(),否则消息将不会传递给Fragment.

IAB的问题是你给出了一个PendingIntent而不是标准来触发,即使你可以在那里移动代码,也Intent没有方法Fragment可以触发初始操作.为了保持原样,你可能需要做一些调整.你可以做的一件事是onAttach()在你的方法中使用自定义界面,Fragment并使用它来让Fragment自己交给自己Activity.就像是:

public class SyncPreferencesActivity extends PreferenceActivity
        implements SyncPreferencesFragment.OnAttachCallback {
    SyncPreferencesFragment mTargetFragment;

    @Override
    public void onAttachSyncFragment(SyncPreferencesFragment fragment) {
        mTargetFragment = fragment;
    }
}
Run Code Online (Sandbox Code Playgroud)

...对应的一些补充Fragment......

public class SyncPreferencesFragment extends PreferenceFragment {
    public interface OnAttachCallback {
        public void onAttachSyncFragment(SyncPreferencesFragment fragment);
    }

    @Override
    public void onAttach(Activity activity) {
        try {
            OnAttachCallback callback = (OnAttachCallback) activity;
            callback.onAttachSyncFragment(this);
        } catch (ClassCastException e) {
            throw new ClassCastException("You Forgot to Implement the Callback!");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

有了这样的东西,至少你有一个对实例的引用,所以你可以转发结果或其他任何可能需要的东西.如果你想要超级干净,你也可以实现一个匹配的"分离",清除中的引用Activity.