web-dev-qa-db-ja.com

Googleのサインインボタンのテキストを編集できますか?

私のアプリケーションをグーグルプラスと統合しています。 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サインインボタンを使用できるようにする方法はありますか?

29
Marco Dinatsoli

私が使用した手法は次のとおりです。

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;
        }
    }
}
95
w.donahue

私が使用した最も簡単な方法は次のとおりです。

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

問題:

他の回答では回避策が言及されています。ボタンの基になる実装はいつでも変更される可能性があり、コードが破損する可能性があります。ハックを使用しようとすると不快に感じました。クリーンなソリューションを得るには、Android:text上のcom.google.Android.gms.common.SignInButtonレイアウトファイルでこのトリックを行います。ただし、その属性はSignInButtonには使用できません。

目的

Googleのガイドライン

ドキュメントから、Googleは サインインボタンのカスタマイズ [アーカイブ済み。アーカイブされたページを参照してください here ]。 Sign-In Branding Guidelines で言及されているブランドガイドラインを使用することをお勧めします。これには、ボタンの特定のカスタムアイコンと画像の使用、特定のテキストサイズ、パディング、およびその他のロゴの禁止事項と禁止事項の設定が含まれます。

クリーンソリューション

Googleの提案に従って行うには、いくつかのカスタム作業が必要です。私はそれをやる気はありましたが、再利用可能なものを作りたいと思ったので、他の人が再びこれを経験する必要はありません。それが、私が簡単な小さな(4KB)ライブラリを作成した理由です。問題が見つかった場合は、皆の利益のために自由に貢献してください。

  • ステップ1:appモジュールレベルbuild.gradleファイル:

    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}":ボタンの青テーマと白テーマを切り替えます。ライブラリは、テキストの色と背景色の変更を処理します。また、ボタンを押すかボタンをクリックすると、色の変更を処理します。

ソース

それが誰かを助けることを願っています。

14
Shobhit Puri

Android:textは、Googleの[ログイン]ボタンがFrameLayoutであるがButtonではないため機能しません。

テキストプロパティはテキスト形式を表すビューのみを対象としており、ViewGroupsは対象としていないため、ソリューションは機能していません。

達成できる唯一の方法は、w.donahueで説明されているように、TextView内でFrameLayoutを定義することです。

1
Chandra Sekhar

初心者向け

いくつかのクラッシュを回避します。

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

このページにある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);
        }
    }
}
0
madx

これらの@ w.donahueアプローチは、オープン/クローズ原則としてのいくつかの原則に違反するため、使用しないことをお勧めします。最善の方法は、独自のサインインボタンをカスタマイズすることです。サインインGoogleプラスボタンに関するドキュメントが表示される場合は、Textviewを備えた単なるFrameLayoutです。このリンクで 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 + 9パッチ拡張機能でさえ、PNGがマークされていないため、編集する必要があることです。

0
Xenione