3

Я успешно выполнил руководство Accessing Google APIs.SignInButton in Fragment - и onClick никогда не вызывается в MainActivity

После этого я решил перенести часть кода в фрагменте:

screenshot

<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <com.google.android.gms.common.SignInButton 
     android:id="@+id/login_button" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:clickable="true" 
     android:onClick="googleLogin" /> 

</FrameLayout> 

И в MainActivity я переехал создание объекта GoogleApiClient из onCreate() в googleLogin() метода:

public void googleLogin(View v) { 
    mGoogleApiClient = new GoogleApiClient.Builder(this) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .addApi(Plus.API) 
      .addScope(Plus.SCOPE_PLUS_PROFILE) 
      .build(); 

    mGoogleApiClient.connect(); 
} 

Однако метод никогда не называется (как я вижу в отладчике).

Что здесь не так, это ошибка (игнорируя атрибут XML) в текущей версии SignInButton?

+0

Попробуйте переместить 'googleLogin()' в класс фрагментов. Поскольку событие Click принадлежит 'SignInButton', которое находится в этом макете. –

+0

Я пробовал, но это не помогло (возможно, потому, что методы 'onClick' обычно вызываются не в Fragment, а в родительском Activity). –

+1

Вы можете попробовать: добавьте 'реализует OnClickListener' в ваш фрагмент И переименуйте свой метод так: @Override public final void onClick (final View v)' (после перемещения его в фрагменте) –

ответ

2

Перед кнопкой мыши

  mGoogleApiClient = new GoogleApiClient.Builder(this) 
        .addConnectionCallbacks(this) 
        .addOnConnectionFailedListener(this) 
        .addApi(Plus.API) 
        .addScope(Plus.SCOPE_PLUS_LOGIN) 
        .build(); 
     btnSignIn = (SignInButton)findViewById(R.id.btn_sign_in); 
     btnSignIn.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) 
        { 
         if (!mGoogleApiClient.isConnecting()) { 
          mSignInClicked = true; 
          mGoogleApiClient.connect(); 
         } 
        } 
       }); 


    @Override 
     public void onActivityResult(int requestCode, int resultCode, Intent data) 
     { 
      super.onActivityResult(requestCode, resultCode, data); 
      if (requestCode == RC_SIGN_IN) 
       { 
        if (resultCode != RESULT_OK) 
        { 
         mSignInClicked = false; 
        } 

        mIntentInProgress = false; 

        if (!mGoogleApiClient.isConnected()) { 
         mGoogleApiClient.reconnect(); 
        } 
       } 


     } 



@Override 
    public void onConnected(Bundle bundle) 
    { 
     mSignInClicked = false; 
     if (Plus.PeopleApi.getCurrentPerson(mGoogleApiClient) != null) 
     { 

      Person currentPerson = Plus.PeopleApi.getCurrentPerson(mGoogleApiClient); 
      //Toast.makeText(Login_Activity.this,str_id,Toast.LENGTH_LONG).show(); 

      str_first_name = currentPerson.getDisplayName(); 
      google_id = currentPerson.getImage().getUrl(); 
      System.out.println("google_id== "+google_id); 
      str_email = Plus.AccountApi.getAccountName(mGoogleApiClient); 
      str_mobile =""; 
      int temp=currentPerson.getGender(); 
      if(temp==0) 
      { 
       str_gender="male"; 
      } 
      else if(temp==1) 
      { 
       str_gender="female"; 
      } 

      str_date_of_birth=currentPerson.getBirthday(); 
      // Toast.makeText(Login_Activity.this,str_gender,Toast.LENGTH_LONG).show(); 
      // Toast.makeText(Login_Activity.this,str_date_of_birth,Toast.LENGTH_LONG).show(); 



     } 

    } 

    @Override 
    public void onConnectionSuspended(int i) { 
     mGoogleApiClient.connect(); 
    } 

    @Override 
    public void onConnectionFailed(ConnectionResult connectionResult) { 

     if (!mIntentInProgress) { 
      if (mSignInClicked && connectionResult.hasResolution()) { 
       // The user has already clicked 'sign-in' so we attempt to resolve all 
       // errors until the user is signed in, or they cancel. 
       try { 
        connectionResult.startResolutionForResult(this, RC_SIGN_IN); 
        mIntentInProgress = true; 

       } catch (IntentSender.SendIntentException e) { 
        // The intent was canceled before it was sent. Return to the default 
        // state and attempt to connect to get an updated ConnectionResult. 
        mIntentInProgress = false; 
        mGoogleApiClient.connect(); 
       } 
      } 
     } 

    } 

Google+ Platform for Android

1

Почему бы не попробовать удаления OnClick в XML и поместить его в фрагмента, который вы создаете макет.

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{ 
    view = inflater.inflate(R.layout.layout, container, false); 
    login_button = (com.google.android.gms.common.SignInButton) view.findViewById(R.id.login_button); 
    login_button.setOnClickListener(this); 
    return view; 
} 

@Override 
public void onClick(View v) 
{ 
    switch (v.getId()) 
    { 
     case R.id.login_button: 
      mGoogleApiClient = new GoogleApiClient.Builder(this) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .addApi(Plus.API) 
      .addScope(Plus.SCOPE_PLUS_PROFILE) 
      .build(); 
      mGoogleApiClient.connect(); 
      break; 
    } 
} 
+0

Да, предложен «способ кода» от Naveen, и вы работаете (+1), но мне было просто любопытно, почему «XML-способ» не работал на 'SignInButton' ... что Google пропустил для реализации там? –

+1

Я не знаком с реализацией google, но я понимаю, что это просто из-за того, что Fragments не может получать onClicks через xml, поскольку он является завышенным представлением и не установлен как просмотр содержимого через onCreate в Activity. –

3

Если бы this же вопрос once.It не будет работать с XML file.Use его в фрагмент или Activity.Remember инициализировать кнопку, прежде чем использовать его:

signInButton = (SignInButton)findViewById(R.id.btn_sign_in); 
    signInButton.setOnClickListener(this); 
Смежные вопросы