J'ai essayé d'utiliser un bouton normal pour exécuter le processus d'authentification avec le sdk Twitter, mais cela ne semble pas fonctionner. Quelqu'un a essayé quelque chose de similaire?
Le code
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");
}
});
}
});
Luis de l'équipe des relations avec les développeurs de Twitter. Fabric prendra en charge le thème de l'avenir, tandis que vous pouvez personnaliser le bouton en créant une vue personnalisée qui hérite de TwitterLoginButton
.
L'exemple d'application Cannonball implémente un bouton personnalisé:
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());
}
}
Fichier de mise en page:
<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" />
Configuration du rappel:
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);
}
});
}
Je vous recommande fortement de cloner le code et d'y jeter un œil.
Vous pouvez y parvenir en utilisant TwitterAuthClient
. c'est à dire,
Tout d'abord, créez un bouton normal comme,
<Button
Android:id:"@+id/Twitter_custom_button"
... />
Maintenant, en vous Java utilise TwitterAuthClient
au lieu de TwitterLoginButton
. Puis définissez votre CallBack
à l'intérieur de Button
) onClick
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);
}
Eh bien, en fait, il y a un moyen de le faire
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);
}
Attention, la partie onActivityResult est très importante, vous semblez l'avoir perdue.
voici mon 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"/>
Étant donné que Fabric ne permet pas encore le thème, nous devons supposer que nous devrons écrire du code potentiellement jetable pour que cela fonctionne. En tant que tel, je préfère moins de code à plus de code quand je sais que je ne le garderai pas.
La solution de Luis fonctionnera bien, mais mon interface utilisateur a été effectuée, avec un bouton déjà, et je voulais juste que ce bouton fonctionne. Voici comment j'ai accompli cela.
Déposez le TwitterLoginButton, comme demandé par l'assistant Fabric, mais définissez-le sur visibilité: disparu
<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" />
Tirez la référence du loginButton dans votre activité (également partie de la configuration de Fabric - rien de nouveau ici):
loginButton = (TwitterLoginButton) findViewById(R.id.Twitter_login_button);
Enfin, pour mon bouton existant, j'ai ajouté un écouteur de clics, qui a simplement délégué l'événement click au bouton de connexion Twitter.
myLoginButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
loginButton.performClick();
}
});
A fonctionné comme un charme.
Vous pouvez également éviter de créer une classe CustomTwitterLoginButton en effectuant l'implémentation par défaut du bouton de connexion Twitter, puis en procédant comme suit:
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);