1

ページの右上 (Facebook のログイン ページの隣) にボタンを配置した画面に Facebook ダイアログがあります。私がやりたいことは、ユーザーがそのボタンを押した場合、Facebook ダイアログを閉じて、Facebook ダイアログを開始したアクティビティ (つまり、以下を呼び出したアクティビティ) にいくつかの値を渡すことです。

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

問題は、DialogListener のコールバック関数 onCancel() がt receive a Bundle. I canパラメーターを元のアクティビティに戻さないため、パラメーターを渡すことができずに Facebook ダイアログを閉じる方法しか知らないことです (署名が 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()ofcloseItボタンを呼び出します。

また

LoginDialogListenerでアクセス可能な場合は、その中でFbDialog新しい関数を定義します(の代わりにonCancel(Bundle)any を使用できます)。次に、あなたのボタンで、呼び出しますObjectBundleonClick()closeIt

closeIt.setOnClickListener(new OnClickListener() {

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

また

新しい機能を持つ の新しいサブクラスを定義しFacebook.DialogListenerます。これは に表示されます。のサブクラスになるように、your を再定義します。あなたのボタンで、呼び出しますclassAonCancel(Bundle)classAFbDialogLoginDialogListenerclassAonClick()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 に答える