1

我有一个首选项屏幕,向用户显示一个禁用广告的复选框。当用户第一次点击它时,他们会看到一个 In App Billing 购买选项来禁用广告。

我在这里面临的问题是我看不到任何将 onActivityResult 回调放入片段的方法。

所以我有一个 PreferenceActivity 加载一个 PreferenceFragment (我似乎无法获得参考)。In App Billing 需要调用startIntentSenderForResultFragments 没有的,只有活动。

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

因为我使用以下内容将 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;
}

我在这里想念什么?我不想拆分我所有的购买逻辑,那么如何让我的 FragmentonActivityForResult接听电话?

4

2 回答 2

5

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

IAB 的问题是您给定的是 aPendingIntent而不是触发标准,即使您可以将代码移到Intent那里,也没有方法可以触发初始操作。Fragment为了保持原样,您可能需要做一些调酒。您可以做的一件事是在onAttach()您的方法中使用自定义接口,并使用它来Fragment允许. 就像是:FragmentActivity

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

    @Override
    public void onAttachSyncFragment(SyncPreferencesFragment fragment) {
        mTargetFragment = fragment;
    }
}

...对相应的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!");
        }
    }
}

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

于 2013-08-01T22:28:38.903 回答
0

这是我用来从偏好活动中获取对偏好片段的引用的一种更简单的方法:

private WeakReference<GeneralPreferenceFragment> mGeneralFragment;

@Override
public void onAttachFragment(Fragment fragment) {
    super.onAttachFragment(fragment);

    // "id" might be arbitrary and "tag" can be null
    Log.d(TAG, "onAttachFragment: "+fragment.getId()+","+fragment.getTag());
    // however class can be used to identify different fragments
    Log.d(TAG, "onAttachFragment: "+fragment.getClass()+","+(fragment instanceof GeneralPreferenceFragment));

    if(fragment instanceof GeneralPreferenceFragment) {
        mGeneralFragment=new WeakReference<>((GeneralPreferenceFragment)fragment);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    Fragment f=mGeneralFragment.get();

    if(f!=null) {
        // can now use findPreference, etc
    }
}

这种方法很方便,因为它不需要使用接口或修改片段类。

于 2017-01-05T12:41:36.077 回答