Подтвердить что ты не робот

Можно ли изменить текст кнопки входа в Google?

Я интегрирую свое приложение с Google Plus. Я установил сервисы Google Play и подписался на свою учетную запись. Также я мог бы опубликовать и добавить один для того, что захочу.

Моя проблема

Я не могу изменить текст кнопки входа.

Мой код

<com.google.android.gms.common.SignInButton
        android:id="@+id/share_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="Share on Google+" />

Что я пробовал?

  • Сначала я попытался добавить эту строку в xml

    android:text="Share on Google+"
    
  • Во-вторых, я попытался установить текст программно, однако это не сработало.

Любая помощь будет оценена.

Изменить

Если это невозможно, есть ли способ, чтобы я мог использовать одну и ту же кнопку входа в Google на другой кнопке?

4b9b3361

Ответ 1

Вот техника, которую я использовал:

protected void setGooglePlusButtonText(SignInButton signInButton, String buttonText) {
    // Find the TextView that is inside of the SignInButton and set its text
    for (int i = 0; i < signInButton.getChildCount(); i++) {
        View v = signInButton.getChildAt(i);

        if (v instanceof TextView) {
            TextView tv = (TextView) v;
            tv.setText(buttonText);
            return;
        }
    }
}

Ответ 2

Вот самый простой способ, который я использовал:

    TextView textView = (TextView) signInButton.getChildAt(0);
    textView.setText("your_text_xyz");

Ответ 3

Проблема:

Другие ответы упоминали обходной путь. Базовая реализация кнопки может измениться в любое время, что приведет к разрыву кода. Мне было неудобно пытаться использовать хаки. Для чистого решения вы бы подумали, что настройка android:text на com.google.android.gms.common.SignInButton в вашем файле макета поможет. Однако оказывается, что этот атрибут недоступен для SignInButton.

цель

mGHPI.png4LSMF.png

Рекомендации Google

Из документации Google предлагает создать пользовательскую кнопку, как указано в разделе "Настройка кнопки входа в систему" [Архивировано сейчас. Смотрите архивную страницу здесь ]. Он предлагает использовать рекомендации по брендингу, как указано в Руководстве по брендингу при входе. Это включает использование заданных пользовательских значков и изображений в кнопке, установку определенного размера текста, отступов и других запретных действий для логотипа.

Чистое решение:

Выполнение согласно предложению Google включает в себя некоторые пользовательские работы. Я был готов сделать это, но хотел создать что-то повторно используемое, чтобы другим не пришлось проходить через это снова. Вот почему я написал небольшую (4KB) библиотеку. Не стесняйтесь вносить свой вклад в это для всех, если вы найдете проблемы.

  • Шаг 1. Добавьте следующее в файл build.gradle уровня модуля app:

    dependencies {
        implementation 'com.shobhitpuri.custombuttons:google-signin:1.0.0'
    }
    
  • Шаг 2: В вашем XML-макете есть следующее:

    <RelativeLayout
        ...
        xmlns:app="http://schemas.android.com/apk/res-auto">
    
        <com.shobhitpuri.custombuttons.GoogleSignInButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:text="@string/google_sign_up"
            app:isDarkTheme="true" />
    </RelativeLayout>
    

использование

  • android:text="{string}": как обычно, чтобы установить текст на кнопке.

  • app:isDarkTheme="{Boolean}": для переключения между синей и белой темами для кнопки. Библиотека обрабатывает изменение цвета текста и фона. Он также обрабатывает изменение цвета при нажатии кнопки или нажатии кнопки.

Источник:

Надеюсь, это кому-нибудь поможет.

Ответ 4

android:text не будет работать, поскольку кнопка входа в Google - это FrameLayout, но не Button.

Поскольку свойство text предназначено только для представлений, представляющих текстовый формат, но не для ViewGroups, ваше решение не работает.

Единственный способ, которым вы можете достичь, - это получить TextView внутри FrameLayout, как объясняется w.donahue.

Ответ 5

Для начинающих

Избегайте нескольких сбоев.

try {
            ((TextView) mGoogleSignOutBtn.getChildAt(0)).setText(R.string.sign_out);
} catch (ClassCastException | NullPointerException e) {
            e.printStackTrace();
}

Ответ 6

Я рекомендую не использовать подход @w.donahue, поскольку он нарушает несколько принципов, таких как принцип открытия/закрытия. Лучше всего подойти к этому, чтобы настроить собственную кнопку входа. Если вы видите документацию о входе в Google плюс, кнопка просто FrameLayout с Textview. По этой ссылке https://developers.google.com/+/branding-guidelines#sign-in-button у вас есть материал для оформления кнопки.

public class GplusButton extends FrameLayout {

private final String logIn="log in with google +";

private final String logOut="log out";

TextView labelTV;

public GplusButton(Context context) {
    super(context, null);
}

public GplusButton(Context context, AttributeSet attrs) {
    super(context, attrs);
    setBackgroundResource(R.drawable.btn_g_plus_signin_normal);
    addTextLabel();
}

public void addTextLabel() {
    labelTV = new TextView(getContext());
    setTextLogIn();
    labelTV.setTextColor(Color.WHITE);
    FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
            LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    params.gravity = Gravity.CENTER;
    addView(labelTV, params);
}

public void setTextLogIn(){
    labelTV.setText(logIn);
}

public void setTextLogOut(){
    labelTV.setText(logOut);

}

Единственное, что раздражает, это то, что даже Google + помечает PNG-расширение 9, что они не являются PNG, так что вам придется редактировать.

Ответ 7

Вы можете использовать этот класс, который я написал на основе ответа w.donahue, который вы можете найти на этой странице:

import android.content.Context;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.TextView;

import com.google.android.gms.common.SignInButton;

public class GoogleLoginButton extends FrameLayout implements View.OnClickListener{

    private SignInButton signInButton;
    private OnClickListener onClickListener;

    public GoogleLoginButton(Context context) {
        super(context);
        init();
    }

    public GoogleLoginButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public GoogleLoginButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        signInButton = new SignInButton(getContext());
        signInButton.setSize(SignInButton.SIZE_STANDARD);
        setGooglePlusButtonText(signInButton, "Test");
        FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        params.gravity = Gravity.CENTER;
        addView(signInButton, params);
    }

    protected void setGooglePlusButtonText(SignInButton signInButton, String buttonText) {
        // Find the TextView that is inside of the SignInButton and set its text
        for (int i = 0; i < signInButton.getChildCount(); i++) {
            View v = signInButton.getChildAt(i);

            if (v instanceof TextView) {
                TextView tv = (TextView) v;
                tv.setText(buttonText);
                return;
            }
        }
    }

    @Override
    public void setOnClickListener(OnClickListener onClickListener) {
        this.onClickListener = onClickListener;
        if(this.signInButton != null) {
            this.signInButton.setOnClickListener(this);
        }
    }

    @Override
    public void onClick(View v) {
        if(this.onClickListener != null && v == this.signInButton) {
            this.onClickListener.onClick(this);
        }
    }
}