2015-03-25 4 views
0

Довольно новый. Я пытаюсь сделать простое приложение для входа в facebook, которое после входа в систему отображает несколько основных пользовательских данных. Когда я пытаюсь запустить приложение, я получаю сообщение «К сожалению, FacebookTest остановился». Кажется, я получаю исключение NullPointerException, но не могу, чтобы жизнь меня определяла почему. Вот мой выход LogCat:NullPointerException MainFragment facebook login

03-25 12:01:16.850  919-919/com.example.robert.facebooktest E/AndroidRuntime﹕ FATAL EXCEPTION: main 
Process: com.example.robert.facebooktest, PID: 919 
java.lang.NullPointerException 
     at com.example.robert.facebooktest.MainFragment$2.onCompleted(MainFragment.java:87) 
     at com.facebook.Request$1.onCompleted(Request.java:283) 
     at com.facebook.Request$4.run(Request.java:1668) 
     at android.os.Handler.handleCallback(Handler.java:733) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:136) 
     at android.app.ActivityThread.main(ActivityThread.java:5017) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:515) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
     at dalvik.system.NativeStart.main(Native Method) 

Мой код выглядит следующим образом:

MainActivity.java



    package com.example.robert.facebooktest; 

      import android.os.Bundle; 
      import android.support.v4.app.FragmentActivity; 

    public class MainActivity extends FragmentActivity { 
     private MainFragment mainFragment; 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 

      if (savedInstanceState == null) { 
       // Add the fragment on initial activity setup 
       mainFragment = new MainFragment(); 
       getSupportFragmentManager().beginTransaction() 
         .add(android.R.id.content, mainFragment).commit(); 
      } else { 
       // Or set the fragment from restored state info 
       mainFragment = (MainFragment) getSupportFragmentManager() 
         .findFragmentById(android.R.id.content); 
      } 
     } 
    } 

MainFragment.java



    package com.example.robert.facebooktest; 

    import android.content.Intent; 
    import android.os.Bundle; 
    import android.support.v4.app.Fragment; 
    import android.util.Log; 
    import android.view.LayoutInflater; 
    import android.view.View; 
    import android.view.ViewGroup; 
    import android.widget.TextView; 

    import com.facebook.Request; 
    import com.facebook.Response; 
    import com.facebook.Session; 
    import com.facebook.SessionState; 
    import com.facebook.UiLifecycleHelper; 
    import com.facebook.model.GraphUser; 
    import com.facebook.widget.LoginButton; 

    public class MainFragment extends Fragment { 

     TextView name; 
     TextView location; 
     TextView gender; 

     private static final String TAG = "MainFragment"; 
     // Create, automatically open (if applicable), save, and restore the 
     // Active Session in a way that is similar to Android UI lifecycles. 
     private UiLifecycleHelper uiHelper; 
     private View otherView; 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      // To maintain FB Login session 
      uiHelper = new UiLifecycleHelper(getActivity(), callback); 
      uiHelper.onCreate(savedInstanceState); 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

      View view = inflater.inflate(R.layout.activity_main, container, false); 
      // Looks for Login button 
      LoginButton authButton = (LoginButton) view.findViewById(R.id.authButton); 
      authButton.setFragment(this); 
      // Set View that should be visible after log-in invisible initially 
      otherView = view.findViewById(R.id.other_views); 
      otherView.setVisibility(View.GONE); 
      //authButton.setReadPermissions(Arrays.asList("user_likes", "user_status","email","user_birthday")); 
      return view; 
     } 

     // Called when session changes 
     private Session.StatusCallback callback = new Session.StatusCallback() { 
      @Override 
      public void call(Session session, SessionState state, 
          Exception exception) { 
       onSessionStateChange(session, state, exception); 
      } 
     }; 

     // When session is changed, this method is called from callback method 
     private void onSessionStateChange(Session session, SessionState state,Exception exception) { 

      final TextView name = (TextView) getView().findViewById(R.id.name); 
      final TextView gender = (TextView) getView().findViewById(R.id.gender); 
      final TextView location = (TextView) getView().findViewById(R.id.location); 

      if (state.isOpened()) { 
       Log.i(TAG, "Logged in..."); 
       // make request to the /me API to get Graph user 
       Request.newMeRequest(session, new Request.GraphUserCallback() { 

        // callback after Graph API response with user 
        // object 
        @Override 
        public void onCompleted(GraphUser user, Response response) { 
         if (user != null) { 
          // Set view visibility to true 
          otherView.setVisibility(View.VISIBLE); 
          // Set User name 
          name.setText("Hello " + user.getName()); 
          // Set Gender 
          gender.setText("Your Gender: " 
            + user.getProperty("gender").toString()); 
          location.setText("Your Current Location: " 
            + user.getLocation().getProperty("name").toString()); 
         }else{ 
          return; 
         } 
        } 
       }).executeAsync(); 
      } else if (state.isClosed()) { 
       Log.i(TAG, "Logged out..."); 
       otherView.setVisibility(View.GONE); 
      } 
     } 

     @Override 
     public void onActivityResult(int requestCode, int resultCode, Intent data) { 
      super.onActivityResult(requestCode, resultCode, data); 

      uiHelper.onActivityResult(requestCode, resultCode, data); 
      Log.i(TAG, "OnActivityResult..."); 
     } 

     @Override 
     public void onResume() { 
      super.onResume(); 
      uiHelper.onResume(); 
     } 

     @Override 
     public void onPause() { 
      super.onPause(); 
      uiHelper.onPause(); 
     } 

     @Override 
     public void onDestroy() { 
      super.onDestroy(); 
      uiHelper.onDestroy(); 
     } 

     @Override 
     public void onSaveInstanceState(Bundle outState) { 
      super.onSaveInstanceState(outState); 
      uiHelper.onSaveInstanceState(outState); 
     } 
    } 

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="@drawable/bg_gradient" 
android:orientation="vertical" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
tools:context="com.example.robert.facebooktest.MainActivity" > 

<ImageView 
    android:layout_width="300dp" 
    android:layout_height="100dp" 
    android:layout_gravity="center" 
    android:src="@drawable/voyager_logo" /> 

<LinearLayout 
    android:id="@+id/other_views" 
    android:layout_width="match_parent" 
    android:layout_height="0dp" 
    android:layout_weight="1" 
    android:orientation="vertical" 
    android:padding="5dp" > 

    <TextView 
     android:id="@+id/name" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="10dip" 
     android:gravity="left" 
     android:text="Name" 
     android:textColor="@color/white" 
     android:textSize="30dp" /> 

    <TextView 
     android:id="@+id/gender" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="10dip" 
     android:gravity="left" 
     android:text="Gender" 
     android:textColor="@color/white" 
     android:textSize="15dp" /> 

    <TextView 
     android:id="@+id/location" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="10dip" 
     android:gravity="left" 
     android:text="Location" 
     android:textColor="@color/white" 
     android:textSize="15dp" /> 
</LinearLayout> 

<LinearLayout 
    android:id="@+id/fb_view" 
    android:layout_width="match_parent" 
    android:layout_height="0dp" 
    android:layout_weight="1" 
    android:gravity="bottom" 
    android:orientation="vertical" 
    android:padding="5dp" > 

<com.facebook.widget.LoginButton 
    android:id="@+id/authButton" 
    android:layout_width="250dp" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center_horizontal" 
    android:layout_marginTop="30dp" /> 
</LinearLayout> 

+1

Возможный дубликат [Что такое Исключение нулевого указателя и как его исправить?] (Http://stackoverflow.com/questions/218384/what-is-a-null-pointer- exception-and-how-do-i-fix-it) –

+0

Что такое строка 87 – Keshav1234

+0

@ Kesh1234 строка 87 is location.setText («Ваше текущее местоположение:» + + user.getLocation(). getProperty («name»). нанизывать()); в MainFragment.java – user2987377

ответ

0

Какая линия № 87 точно? Где-то в onCompleted()

+0

строка 87 is location.setText («Ваше текущее местоположение:» + + user.getLocation(). GetProperty («name»). ToString()); в MainFragment.java – user2987377

+0

Убедитесь, что getProperty ("name") не возвращает значение null – Ryan