2017-02-02 1 views
-1

Я слежу за учебником, чтобы добавить панель навигации в свое приложение. Однако перед добавлением соответствующего кода после регистрации пользователя пользователь будет автоматически зарегистрирован и перенаправлен в класс LoggedInMenu. Поскольку вы пытаетесь создать панель навигации, приложение вызывается после нажатия кнопки регистрации.Приложение сохраняет сбои после попытки добавления панели навигации

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

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.example.XXXXXXXXX.computerscienceinduction"> 

<uses-permission android:name="android.permission.INTERNET" /> 

<application 
android:allowBackup="true" 
android:icon="@mipmap/ic_launcher" 
android:label="@string/app_name" 
android:supportsRtl="true" 
android:theme="@style/AppTheme"> 
<activity android:name=".UserTypeSelection"> 
    <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 

     <category android:name="android.intent.category.LAUNCHER" /> 
    </intent-filter> 
</activity> 
<activity android:name=".RegistrationActivity" /> 
<activity android:name=".LoginActivity" /> 
<activity android:name=".LoggedInMenu" /> 
<activity android:name=".GuestMenu" /> 
<activity android:name=".ListContacts" /> 
<activity 
    android:name=".NavDrawerActivity" 
    android:label="@string/title_activity_nav_drawer" 
    android:theme="@style/AppTheme.NoActionBar"></activity> 
</application> 

</manifest> 

Мой класс LoggedInMenu в котором я внес изменения в свой код, чтобы создать навигационную панель выглядит следующим образом:

package com.example.XXXXXXXXX.computerscienceinduction; 

import android.content.Intent; 
import android.content.res.Configuration; 
import android.support.v4.widget.DrawerLayout; 
import android.support.v7.app.ActionBarDrawerToggle; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.Toast; 

import com.google.firebase.auth.FirebaseAuth; 
import com.google.firebase.auth.FirebaseUser; 

public class LoggedInMenu extends AppCompatActivity implements View.OnClickListener{ 

private FirebaseAuth firebaseAuth; 

private TextView textViewUserEmail; 
private Button buttonLogout; 
private ListView mDrawerList; 
private ArrayAdapter<String> mAdapter; 
private ActionBarDrawerToggle mDrawerToggle; 
private DrawerLayout mDrawerLayout; 
private String mActivityTitle; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_logged_in_menu); 

    firebaseAuth = FirebaseAuth.getInstance(); 

    if(firebaseAuth.getCurrentUser() == null) { 
     finish(); 
     startActivity(new Intent(this, LoginActivity.class)); 
    } 

    FirebaseUser user = firebaseAuth.getCurrentUser(); 

    textViewUserEmail = (TextView) findViewById(R.id.textViewUserEmail); 

    textViewUserEmail.setText("Welcome " + user.getEmail()); 

    buttonLogout = (Button) findViewById(R.id.buttonLogout); 

    buttonLogout.setOnClickListener(this); 

    mDrawerList = (ListView)findViewById(R.id.navList); 

    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    getSupportActionBar().setHomeButtonEnabled(true); 

    mDrawerLayout = (DrawerLayout)findViewById(R.id.drawer_layout); 
    mActivityTitle = getTitle().toString(); 
} 

private void addDrawerItems() { 
    String[] osArray = { "Android", "iOS", "Windows", "OS X", "Linux" }; 
    mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, osArray); 
    mDrawerList.setAdapter(mAdapter); 

    mDrawerList.setOnItemClickListener(new AdapterView.OnItemClickListener(){ 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      Toast.makeText(LoggedInMenu.this, "Time for an upgrade!", Toast.LENGTH_SHORT).show(); 
     } 
    }); 
} 

private void setupDrawer() { 
    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, 
      R.string.navigation_drawer_open, R.string.navigation_drawer_close) { 

     /** Called when a drawer has settled in a completely open state. */ 
     public void onDrawerOpened(View drawerView) { 
      super.onDrawerOpened(drawerView); 
      getSupportActionBar().setTitle("Navigation!"); 
      invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() 
     } 

     /** Called when a drawer has settled in a completely closed state. */ 
     public void onDrawerClosed(View view) { 
      super.onDrawerClosed(view); 
      getSupportActionBar().setTitle(mActivityTitle); 
      invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() 
     } 
    }; 

    mDrawerToggle.setDrawerIndicatorEnabled(true); 
    mDrawerLayout.setDrawerListener(mDrawerToggle); 
} 

@Override 
public void onClick(View view) { 

    if(view == buttonLogout) { 
     firebaseAuth.signOut();; 
     finish(); 
     startActivity(new Intent(this, LoginActivity.class)); 
    } 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    // Activate the navigation drawer toggle 
    if (mDrawerToggle.onOptionsItemSelected(item)) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

@Override 
protected void onPostCreate(Bundle savedInstanceState) { 
    super.onPostCreate(savedInstanceState); 
    // Sync the toggle state after onRestoreInstanceState has occurred. 
    mDrawerToggle.syncState(); 
} 

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    mDrawerToggle.onConfigurationChanged(newConfig); 
} 

} 

Учебник делает расширение ActionBarActivity, а не AppCompatActivity, которое я изначально использовал при кодировании функции входа, но я не уверен, что это имеет значение.

Любая помощь приветствуется, спасибо.

EDIT:

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

E/AndroidRuntime: FATAL EXCEPTION: main 
        Process: com.example.XXXXXXXXX.computerscienceinduction, PID: 27827 
        java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.XXXXXXXXX.computerscienceinduction/com.example.XXXXXXXXX.computerscienceinduction.LoggedInMenu}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.app.ActionBarDrawerToggle.syncState()' on a null object reference 
         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3253) 
         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349) 
         at android.app.ActivityThread.access$1100(ActivityThread.java:221) 
         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794) 
         at android.os.Handler.dispatchMessage(Handler.java:102) 
         at android.os.Looper.loop(Looper.java:158) 
         at android.app.ActivityThread.main(ActivityThread.java:7225) 
         at java.lang.reflect.Method.invoke(Native Method) 
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
        Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.app.ActionBarDrawerToggle.syncState()' on a null object reference 
         at com.example.XXXXXXXXX.computerscienceinduction.LoggedInMenu.onPostCreate(LoggedInMenu.java:135) 
         at android.app.Instrumentation.callActivityOnPostCreate(Instrumentation.java:1216) 
         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3235) 
         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349) 
         at android.app.ActivityThread.access$1100(ActivityThread.java:221) 
         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794) 
         at android.os.Handler.dispatchMessage(Handler.java:102) 
         at android.os.Looper.loop(Looper.java:158) 
         at android.app.ActivityThread.main(ActivityThread.java:7225) 
         at java.lang.reflect.Method.invoke(Native Method) 
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
+0

Какова ваша ошибка stacktrace? – Gudin

+0

Привет, я добавил его в OP – Spartan123

ответ

2

Где вызывается метод setupDrawer()?

+0

Спасибо! Я не заметил, что мне не хватает addDrawerItems(); setupDrawer(); в методе onCreate, пока вы не упомянули об этом. Я добавил эти строки сейчас, и приложение больше не вылетает. – Spartan123

+0

Тогда примите мой ответ: D –

+0

Вы должны принять не только голос;) –

Смежные вопросы