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); 
} 

} 

다음과 같이

내 매니페스트 파일입니다 내가 처음에 로그인 기능을 코딩 할 때 사용한 AppCompatActivity보다는 ActionBarActivity를 확장하십시오. 그러나 차이가 있는지 확실하지 않습니다.

도움을 주시면 감사하겠습니다.

편집 :

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

오류 스택 추적은 무엇입니까? – Gudin

+0

안녕하세요, OP에 추가했습니다 – Spartan123

답변

2

어디 setupDrawer() 메서드를 호출 할 다음과 같이

디버깅 후, 스택 추적은?

+0

감사합니다! addDrawerItems()가 누락되었음을 알지 못했습니다. setupDrawer(); 당신이 언급 할 때까지 onCreate 메소드에서. 나는 지금 그 라인을 추가했고 앱은 더 이상 충돌하지 않습니다. – Spartan123

+0

다음 내 대답을 수락 : D –

+0

당신은 투표뿐만 아니라 받아 들여야한다;) –

관련 문제