android - ¿Usar el botón de inicio de sesión personalizado con Twitter Fabric?
fabric-twitter (5)
He intentado usar un botón normal para ejecutar el proceso de autenticación con el sdk de Twitter, pero parece que no funciona. ¿Alguien ha intentado algo similar?
- He configurado correctamente las teclas API, etc.
- El proceso de inicio de sesión se ejecuta correctamente, pero parece que no se llama a la parte de devolución de llamada.
- Ninguno de mis registros se ejecuta (ni la parte de éxito ni falla)
El código
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");
}
});
}
});
Bueno, en realidad hay una forma de hacerlo
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);
}
Tenga en cuenta que en la parte de Actividad de actividad es muy importante, parece que la perdió.
aquí está mi 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"/>
Dado que Fabric aún no permite la creación de temas, debemos suponer que tendremos que escribir potencialmente descartar el código para que esto funcione. Como tal, prefiero menos código a más código cuando sé que no lo guardaré.
La solución de Luis funcionará bien, pero mi interfaz de usuario ya estaba lista, con un botón, y solo quería que ese botón funcionara. Así es como logré esto.
Coloque en TwitterLoginButton, como lo solicitó el asistente de Fabric, pero configúrelo en visibilidad: ido
<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" />
Tire de la referencia del loginButton en su Activity (también parte de la configuración de Fabric - nada nuevo aquí):
loginButton = (TwitterLoginButton) findViewById(R.id.twitter_login_button);
Finalmente, para mi botón existente, agregué un oyente de clic, que simplemente delegó el evento click al botón de inicio de sesión de Twitter.
myLoginButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
loginButton.performClick();
}
});
Trabajado como un encanto.
Luis del equipo de Relaciones con Desarrolladores en Twitter. Fabric lo admitirá en el futuro, mientras tanto, puede personalizar el botón creando una vista personalizada que herede de TwitterLoginButton
.
La aplicación de ejemplo Cannonball implementa un botón personalizado:
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());
}
}
Archivo de diseño:
<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" />
Configuración de devolución de llamada
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);
}
});
}
Te recomiendo clonar el código y echarle un vistazo.
Si quieres instalar la aplicación en Android: http://t.co/cb-android
Puedes lograr esto usando TwitterAuthClient
. es decir,
En primer lugar, crea un botón normal como,
<Button
android:id:"@+id/twitter_custom_button"
... />
Ahora, en su archivo de clase java, use TwitterAuthClient
lugar de TwitterLoginButton
. luego configure su CallBack
dentro 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);
}
También puede evitar crear una clase CustomTwitterLoginButton haciendo la implementación predeterminada del botón de inicio de sesión de twitter y luego hacer esto:
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);