1

我在屏幕中有一个 facebook 对话框,我在页面的右上角(在 Facebook 的登录页面旁边)放置了一个按钮。我想要做的是,如果用户点击该按钮,关闭 Facebook 对话框并为启动 Facebook 对话框的活动传递一些值(即调用的活动:

  mFacebook.authorize(this, Settings.FACEBOOK_PERMISSIONS, Facebook.FORCE_DIALOG_AUTH, new LoginDialogListener());

问题是我只知道如何关闭 Facebook 对话框而无法将任何参数传递给它,因为 DialogListener 的回调函数 onCancel() 不会t receive a Bundle. I can将参数传递回原始活动(如果签名是 onCancel 我可以(捆绑包))。

换句话说,我想要的是类似于 onCancel(Bundle bundle) (不幸的是,它不存在)或以编程方式返回回调 onComplete(Bundle values) 的方式,因为这样,我可以阅读我在屏幕上显示 Facebook 对话框时设置的捆绑值)。

先感谢您!

更新(代码)

private class LoginDialogListener implements DialogListener {

    public void onComplete(Bundle values) {
        Settings.setFBStats(Settings.getFBStats() + 1);
        facebookPost();
        Util.showThanks(PhotoActivity.this, galleryName);
    }

    public void onFacebookError(FacebookError error) {
    }

    public void onError(DialogError error) {
    }

    public void onCancel() {
        System.out.println("Hi! =D");
    }
}





public void facebook(View target) {
    mFacebook = new Facebook( getString(R.string.facebookappid) );
    mAsyncRunner = new AsyncFacebookRunner(mFacebook);
    mAsyncRunner.logout(this, new LogoutRequestListener());
    mFacebook.authorize(this, Settings.FACEBOOK_PERMISSIONS,    Facebook.FORCE_DIALOG_AUTH, new LoginDialogListener());
}

这是 FbDialog.java 的 onCreate() 方法中的代码:

      @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mSpinner = new ProgressDialog(getContext());
    mSpinner.requestWindowFeature(Window.FEATURE_NO_TITLE);
    mSpinner.setMessage("Loading...");

    requestWindowFeature(Window.FEATURE_NO_TITLE);

    mContent = new FrameLayout(getContext());

    /* Create the 'x' image, but don't add to the mContent layout yet
     * at this point, we only need to know its drawable width and height 
     * to place the webview
     */
    createCrossImage();

    overlay = new ImageView(getContext());
    overlay.setImageDrawable(getContext().getResources().getDrawable(R.drawable.overlay_horiz));
    overlay.setTop(0);
    overlay.setLeft(0);
    overlay.setVisibility(View.INVISIBLE);

    /* Now we know 'x' drawable width and height, 
     * layout the webivew and add it the mContent layout
     */
    int crossWidth = mCrossImage.getDrawable().getIntrinsicWidth();
    setUpWebView(crossWidth / 2);


    /* Finally add the 'x' image to the mContent layout and
     * add mContent to the Dialog view
     */

    mContent.addView(mCrossImage, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

    FrameLayout main = new FrameLayout(getContext());
    main.addView(overlay, new LayoutParams(1280, 755));

    RelativeLayout rel = new RelativeLayout(getContext());

    mContent.setPadding(450, 60, 0, 0);
    rel.addView(mContent, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));

    closeIt = new ImageButton(getContext());
    closeIt.setBackgroundDrawable(getContext().getResources().getDrawable(R.drawable.closefb));

    RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(282, 150);
    lp.setMargins(980, 10, 0, 0);

    closeIt.setVisibility(View.INVISIBLE);
    closeIt.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            mListener.onCancel();
            FbDialog.this.hide();//HERE!!! =D
        }
    });

    rel.addView(closeIt,lp);

    main.addView(rel, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));

    addContentView(main, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
}

我正在谈论的按钮是closeIt按钮。

看到 closeIt 按钮的 setOnClickListener 方法了吗?所以,我只能关闭或隐藏按钮。当我执行任何操作(关闭或隐藏)时,会调用 LoginDialogListener 的 onCancel() 方法。问题是我无法检测到它来自该按钮,因为当用户按下 facebook 对话框旁边的默认 X 按钮时,流程也会转到相同的 onCancel() 方法。如果我能够检测到它来自我的按钮,那么我可以在代码中做一些我想做的其他事情。

再一次感谢你。

4

1 回答 1

0

更改Facebook.DialogListener类并为其添加新onCancel(Bundle)功能,(您也可以将现有更改onCancel()onCancel(Bundle),但应避免这样做以保持与现有代码的兼容性。),然后onCancel(bundle)调用onClick()按钮closeIt

或者

如果LoginDialogListener可以访问,FbDialog则在其中定义一个新函数onCancel(Bundle)(您可以使用 anyObject代替Bundle)。然后在你onClick()closeIt按钮中,调用

closeIt.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            ...initialize_bundle...
            ((LoginDialogListener) mListener).onCancel(bundle);
            FbDialog.this.hide();//HERE!!! =D
        }
    });

或者

定义一个新的子类Facebook.DialogListener,让我们说classA,有一个新的onCancel(Bundle)功能。这classA应该对FbDialog. 现在重新定义您的LoginDialogListener,使其成为classA. 在你onClick()closeIt按钮中,调用

closeIt.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            ...initialize_bundle...
            ((classA) mListener).onCancel(bundle);
            FbDialog.this.hide();//HERE!!! =D
        }
    });

希望能帮助到你 !!

于 2012-05-17T19:15:22.607 回答