Android(Facebook API)-如何强制调用onComplete(捆绑值)?
我在屏幕上有一个facebook对话框,我在页面右上角的facebook登录页面旁边放了一个按钮。我想做的是,如果用户点击该按钮,关闭Facebook对话框,并传递启动Facebook对话框的活动的一些值,即调用:Android(Facebook API)-如何强制调用onComplete(捆绑值)?,android,facebook,dialog,bundle,Android,Facebook,Dialog,Bundle,我在屏幕上有一个facebook对话框,我在页面右上角的facebook登录页面旁边放了一个按钮。我想做的是,如果用户点击该按钮,关闭Facebook对话框,并传递启动Facebook对话框的活动的一些值,即调用: mFacebook.authorize(this, Settings.FACEBOOK_PERMISSIONS, Facebook.FORCE_DIALOG_AUTH, new LoginDialogListener()); 问题是,我只知道如何关闭Facebook对话框,而无
mFacebook.authorize(this, Settings.FACEBOOK_PERMISSIONS, Facebook.FORCE_DIALOG_AUTH, new LoginDialogListener());
问题是,我只知道如何关闭Facebook对话框,而无法向其传递任何参数,因为DialogListener的回调函数onCancel没有收到捆绑包。如果签名是onCancelBundle捆绑包,我无法将参数传递回原始活动
换句话说,我想要的是类似onCancelBundle捆绑包的东西,不幸的是,它不存在,或者是一种通过编程返回回调onCompleteBundle值的方法,因为这样,我可以读取在Facebook对话框出现在屏幕上时设置的捆绑包值
提前谢谢你
更新代码
下面是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方法。如果我能够检测到它来自我的按钮,那么我可以在代码中做一些我想要的其他事情
再次感谢您。更改Facebook.DialogListener类并向其添加新的onCancelBundle函数,您也可以将现有的onCancel更改为onCancelBundle,但应避免此操作,以保持与现有代码的兼容性,然后在单击closeIt按钮时调用onCancelBundle
或
如果在FbDialog中可以访问LoginDialogGlistener,则在其中定义一个新函数onCancelBundle,您可以使用任何对象而不是Bundle。然后,在您单击closeIt按钮时,调用
closeIt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
...initialize_bundle...
((LoginDialogListener) mListener).onCancel(bundle);
FbDialog.this.hide();//HERE!!! =D
}
});
closeIt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
...initialize_bundle...
((classA) mListener).onCancel(bundle);
FbDialog.this.hide();//HERE!!! =D
}
});
或
定义Facebook.DialogListener的一个新子类,比如说classA,它有一个新的onCancelBundle函数。此classA应该对FbDialog可见。现在重新定义LoginDialGlistener,使其成为classA的子类。在单击closeIt按钮时,调用
closeIt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
...initialize_bundle...
((LoginDialogListener) mListener).onCancel(bundle);
FbDialog.this.hide();//HERE!!! =D
}
});
closeIt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
...initialize_bundle...
((classA) mListener).onCancel(bundle);
FbDialog.this.hide();//HERE!!! =D
}
});
希望能有帮助 当fb对话框打开时,您是否能够单击活动屏幕上的按钮?而且这个包来自facebook代码,为什么你还要编辑它呢?我在facebook对话框的登录屏幕旁创建了一个按钮。我可以点击它,但在那之后,我能做的最多的就是关闭Facebook对话框,而不将任何参数传递给之前的活动——启动Facebook对话框的活动。如果用户按下按钮,我只想将一些参数传递给上一个活动,但我找不到方法。你在facebook对话框上有按钮吗?如果没有,则只能在对话框关闭后单击该按钮。前一个活动是否也没有收到onCancel回调?如果是,则表示用户已取消该对话框。是的,我在Facebook对话框中有我的按钮。我按程序把它放在那里,就在登录字段旁边。因此,当用户点击按钮时,我可以关闭对话框,这使我返回onCancel方法。但是,如果用户点击Facebook对话框上角的标准x按钮,它也会进入onCancel方法。我需要能够区分用户何时按下X按钮或我的按钮,这就是为什么我需要像onCancelBundle b这样的东西。这样我就可以填充包,看看用户是否按下了我的按钮。你能发布你的按钮相关代码吗?如何访问FBDialog。一种方法是,您可以将DialogListener子类化,定义一个新函数,或者重载onCancel并将其传入Authority,然后在连接到按钮的onClickListener中传递所需的值。嗨,Kailash,再次感谢您的回复。我觉得我们快结束了!=但我有一个问题:如何调用我将创建的onCancellBundle b方法?这是一个回调函数,所以我不知道如何调用它。LoginDialogGlistener私有类位于不同的.java文件中,而FbDialog.java.位于不同的java文件中并不重要,除非facebook代码是不同的项目,例如图书馆项目。看来您对Java还是新手。如果你真的想要简单的解决方法,请选择第一种见我答案的方法,否则选择第三种最后一种方法。关于如何打电话?我已经更新了我的答案。好吧,解决方案3是正确的选择,因为Facebook代码在它自己的项目中。谢谢你,凯拉什!很抱歉没有接受你的问题 躺卧者。这周我在办公室里疯了,我忘了这么做。