使用Twitter Fabric的自定义loginbutton?

我一直在尝试使用正常的button来执行与Twitter的SDK的身份validation过程,但似乎并没有工作。 任何人都试过类似的东西?

  • 我已经正确设置了API密钥等。
  • login过程正确执行,但callback部分似乎不被调用。
  • 我的日志都没有执行(无论是成功还是失败的部分)

代码

buttonTwitterLogin.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Twitter.logIn(LoginActivity1.this, new Callback<TwitterSession>() { @Override public void success(Result<TwitterSession> twitterSessionResult) { Log.i(TAG, "success"); Log.i(TAG, twitterSessionResult.toString()); } @Override public void failure(TwitterException e) { Log.e(TAG, "failed"); } }); } }); 

Solutions Collecting From Web of "使用Twitter Fabric的自定义loginbutton?"

来自Twitter的开发者关系团队的Luis。 Fabric将支持未来的主题,同时你可以通过创build一个inheritance自TwitterLoginButton的自定义视图来自定义button。

炮弹示例应用程序实现一个自定义button:

 public class CannonballTwitterLoginButton extends TwitterLoginButton { public CannonballTwitterLoginButton(Context context) { super(context); init(); } public CannonballTwitterLoginButton(Context context, AttributeSet attrs) { super(context, attrs); init(); } public CannonballTwitterLoginButton(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } private void init() { if (isInEditMode()){ return; } setCompoundDrawablesWithIntrinsicBounds(getResources().getDrawable(R.drawable .ic_signin_twitter), null, null, null); setBackgroundResource(R.drawable.sign_up_button); setTextSize(20); setPadding(30, 0, 10, 0); setTextColor(getResources().getColor(R.color.tw__blue_default)); setTypeface(App.getInstance().getTypeface()); } } 

https://github.com/twitterdev/cannonball-android/blob/master/app/src/main/java/io/fabric/samples/cannonball/view/CannonballTwitterLoginButton.java

布局文件:

 <io.fabric.samples.cannonball.view.CannonballTwitterLoginButton android:id="@+id/twitter_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/sign_up_button" android:layout_marginTop="@dimen/login_button_margin_top" android:layout_marginBottom="@dimen/login_button_margin_bottom" android:layout_marginLeft="@dimen/login_button_margin_start" android:layout_marginStart="@dimen/login_button_margin_start" android:layout_marginRight="@dimen/login_button_margin_end" android:layout_marginEnd="@dimen/login_button_margin_end" android:text="@string/sign_in_with_twitter" android:textColor="@color/grayish_blue" android:textSize="@dimen/login_button_text_size" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_alignParentRight="true" android:layout_alignParentEnd="true" /> 

https://github.com/twitterdev/cannonball-android/blob/master/app/src/main/res/layout/activity_login.xml

回拨设置:

 private void setUpTwitterButton() { twitterButton = (TwitterLoginButton) findViewById(R.id.twitter_button); twitterButton.setCallback(new Callback<TwitterSession>() { @Override public void success(Result<TwitterSession> result) { SessionRecorder.recordSessionActive("Login: twitter account active", result.data); startThemeChooser(); } @Override public void failure(TwitterException exception) { Toast.makeText(getApplicationContext(), getResources().getString(R.string.toast_twitter_signin_fail), Toast.LENGTH_SHORT).show(); Crashlytics.logException(exception); } }); } 

https://github.com/twitterdev/cannonball-android/blob/master/app/src/main/java/io/fabric/samples/cannonball/activity/LoginActivity.java

我强烈build议你克隆代码,并看看它。

如果你想在Android上安装应用程序: http : //t.co/cb-android

你可以通过使用TwitterAuthClient来实现。 即

首先创build正常的button,

 <Button android:id:"@+id/twitter_custom_button" ... /> 

现在,在你的java类文件中使用TwitterAuthClient而不是TwitterLoginButton 。 然后在ButtononClick设置你的CallBack

 TwitterAuthClient mTwitterAuthClient= new TwitterAuthClient(); Button twitter_custom_button = (Button) findViewById(R.id.twitter_custom_button); twitter_custom_button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mTwitterAuthClient.authorize(this, new com.twitter.sdk.android.core.Callback<TwitterSession>() { @Override public void success(Result<TwitterSession> twitterSessionResult) { // Success } @Override public void failure(TwitterException e) { e.printStackTrace(); } }); } }); @Override protected void onActivityResult(int requestCode, int responseCode, Intent intent) { mTwitterAuthClient.onActivityResult(requestCode, responseCode, intent); } 

那么实际上有一个这样做的方法

  private TwitterAuthClient client; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); TwitterAuthConfig authConfig = new TwitterAuthConfig(TWITTER_KEY, TWITTER_SECRET); Fabric.with(this, new Twitter(authConfig)); client = new TwitterAuthClient(); Button customLoginButton = (Button) findViewById(R.id.custom_twitter_login); customLoginButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { client.authorize(LoginActivity.this, new Callback<TwitterSession>() { @Override public void success(Result<TwitterSession> twitterSessionResult) { Toast.makeText(LoginActivity.this, "success", Toast.LENGTH_SHORT).show(); } @Override public void failure(TwitterException e) { Toast.makeText(LoginActivity.this, "failure", Toast.LENGTH_SHORT).show(); } }); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); client.onActivityResult(requestCode, resultCode, data); } 

注意,onActivityResult部分是非常重要的,你似乎失去了它。

这里是我的xml:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:id="@+id/custom_twitter_login" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/padding_medium" android:text="@string/twitter_login"/> 

由于Fabric不允许主题化,所以我们应该假设我们必须写可能会丢掉代码才能使其工作。 因此,当我知道我不会保留它时,我更喜欢更less的代码来更多的代码。

路易斯的解决scheme将正常工作,但我的用户界面已完成,已经有一个button,我只是想要button的工作。 以下是我如何做到这一点。

按照Fabric向导的要求放入TwitterLoginButton,但将其设置为可见性:不见了

  <com.twitter.sdk.android.core.identity.TwitterLoginButton android:id="@+id/twitter_login_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:visibility="gone" /> 

在活动中拉动loginButton的引用(也是Fabric安装的一部分 – 这里没有新东西):

 loginButton = (TwitterLoginButton) findViewById(R.id.twitter_login_button); 

最后,对于我现有的button,我添加了一个点击侦听器,它只是简单地将点击事件委托给twitterloginbutton。

 myLoginButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { loginButton.performClick(); } }); 

像魅力一样工作。

您还可以通过执行twitterloginbutton的默认实现来避免创buildCustomTwitterLoginButton类,然后执行此操作:

 twitterLoginButton.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null); twitterLoginButton.setBackgroundResource(R.drawable.btn_twitter); twitterLoginButton.setCompoundDrawablePadding(0); twitterLoginButton.setPadding(0, 0, 0, 0); twitterLoginButton.setText("Login with Twitter"); twitterLoginButton.setTextSize(18);