web-dev-qa-db-fra.com

Vous utilisez un bouton de connexion personnalisé avec Twitter Fabric?

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?

  • J'ai correctement configuré les clés API, etc.
  • Le processus de connexion s'exécute correctement mais la partie de rappel ne semble pas être appelée.
  • Aucun de mes journaux n'est exécuté (ni la partie succès ou échec)

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");
            }
        });
    }
});
25
Vannen

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());
    }
}

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

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" />

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

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);
        }
    });
}

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

Je vous recommande fortement de cloner le code et d'y jeter un œil.

21
Cipriani

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);
}
103
Jaydipsinh Zala

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"/>
46
Defuera

É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.

30
Lo-Tan

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);
2
gilsaints88