2016-03-03 90 views
0

我是android开发领域的新手。我正在尝试创建NavigationDrawerFragment。尝试在空对象引用上调用虚拟方法'android.view.View android.app.Activity.findViewById(int)'参考

请帮我解决这个错误: Attempt to invoke virtual method 'android.view.View android.app.Activity.findViewById(int)' on a null object reference

package nikita.materialtst; 


import android.content.Context; 
import android.content.SharedPreferences; 
import android.os.Bundle; 
import android.app.Fragment; 
import android.support.v4.widget.DrawerLayout; 
import android.support.v7.app.ActionBar; 
import android.support.v7.app.ActionBarDrawerToggle; 
import android.support.v7.widget.Toolbar; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 


/** 
* A simple {@link Fragment} subclass. 
*/ 
public class NavigationDrawerFragment extends Fragment { 

public static final String PREF_FILE_NAME="testpref"; 
public static final String KEY_USER_LEARNED_DRAWER="user_learned_drawer"; 
private ActionBarDrawerToggle mDrawerToggle; 
private DrawerLayout mDrawerLayout; 
private View containerView; 

private boolean mUserLearnedDrawer; 
private boolean mFromSavedInstanceState; 

public NavigationDrawerFragment() { 
    // Required empty public constructor 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mUserLearnedDrawer=Boolean.valueOf(readFromPreferences(getActivity(),KEY_USER_LEARNED_DRAWER,"false")); 
    if(savedInstanceState!=null){ 
     mFromSavedInstanceState=true; 
    } 

} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    return inflater.inflate(R.layout.fragment_navigation_drawer, container, false); 
} 

public void setUp(int fragmentId , DrawerLayout drawerLayout, Toolbar toolbar) { 
    containerView=getActivity().findViewById(fragmentId); 
    mDrawerLayout= drawerLayout; 
    mDrawerToggle=new ActionBarDrawerToggle(getActivity(),drawerLayout,toolbar,R.string.drawer_open,R.string.drawer_close){ 
     @Override 
     public void onDrawerOpened(View drawerView) { 
      super.onDrawerOpened(drawerView); 
      if(!mUserLearnedDrawer){ 
       mUserLearnedDrawer=true; 
       saveToPreferences(getActivity(),KEY_USER_LEARNED_DRAWER,mUserLearnedDrawer+""); 
      } 

      getActivity().invalidateOptionsMenu(); 
     } 

     @Override 
     public void onDrawerClosed(View drawerView) { 
      super.onDrawerClosed(drawerView); 
      getActivity().invalidateOptionsMenu(); 
     } 
    }; 
    if(!mUserLearnedDrawer && !mFromSavedInstanceState){ 
     mDrawerLayout.openDrawer(containerView); 
    } 

    mDrawerLayout.setDrawerListener(mDrawerToggle); 
    mDrawerLayout.post(new Runnable() { 
     @Override 
     public void run() { 
      mDrawerToggle.syncState(); 
     } 
    }); 

} 
public static void saveToPreferences(Context context,String preferenceName,String preferenceValue){ 
    SharedPreferences sharedPreferences=context.getSharedPreferences(PREF_FILE_NAME,Context.MODE_PRIVATE); 
    SharedPreferences.Editor editor=sharedPreferences.edit(); 
    editor.putString(preferenceName,preferenceValue); 
    editor.apply(); 
} 


public static String readFromPreferences(Context context, String preferenceName, String defaultValue){ 
    SharedPreferences sharedPreferences=context.getSharedPreferences(PREF_FILE_NAME,Context.MODE_PRIVATE); 
    return sharedPreferences.getString(preferenceName,defaultValue); 
} 

}

登录

Process: nikita.materialtst, PID: 8089 
java.lang.RuntimeException: Unable to start activity ComponentInfo{nikita.materialtst/nikita.materialtst.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.app.Activity.findViewById(int)' on a null object reference 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
at android.app.ActivityThread.-wrap11(ActivityThread.java) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:148) 
at android.app.ActivityThread.main(ActivityThread.java:5417) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.app.Activity.findViewById(int)' on a null object reference 
at nikita.materialtst.NavigationDrawerFragment.setUp(NavigationDrawerFragment.java:53) 
at nikita.materialtst.MainActivity.onCreate(MainActivity.java:50) 
at android.app.Activity.performCreate(Activity.java:6237) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)  
at android.app.ActivityThread.-wrap11(ActivityThread.java)  
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)  
at android.os.Handler.dispatchMessage(Handler.java:102)  
at android.os.Looper.loop(Looper.java:148)  
at android.app.ActivityThread.main(ActivityThread.java:5417)  
at java.lang.reflect.Method.invoke(Native Method)  
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  
03-03 20:53:03.511 8089-8089/nikita.materialtst I/Process: Sending signal.  PID: 8089 SIG: 9 

MainActivity.java

package nikita.materialtst; 

import android.app.ActionBar; 
import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.provider.ContactsContract; 
import android.support.design.widget.FloatingActionButton; 
import android.support.design.widget.Snackbar; 
import android.support.v4.widget.DrawerLayout; 
import android.support.v7.app.ActionBarActivity; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.widget.Toast; 

public class MainActivity extends AppCompatActivity implements View.OnClickListener{ 

private Toolbar toolbar; 
private MainActivity mainActivity; 
private Class<SubMaterialTst> subMaterialTstClass; 

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

    toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    TextView tv_login= (TextView) findViewById(R.id.tv_login); 
    EditText et_email= (EditText) findViewById(R.id.et_email); 
    EditText et_password= (EditText) findViewById(R.id.et_password); 
    Button button= (Button) findViewById(R.id.button); 
    TextView tv_registerLink= (TextView) findViewById(R.id.tv_registerLink); 

    button.setOnClickListener(this); 
    tv_registerLink.setOnClickListener(this); 

    getSupportActionBar().setDisplayShowHomeEnabled(true); 

    NavigationDrawerFragment drawerFragment =new NavigationDrawerFragment(); 
      getSupportFragmentManager().findFragmentById(R.id.fragment_navigation_drawer); 
    drawerFragment.setUp(R.id.fragment_navigation_drawer, (DrawerLayout) findViewById(R.id.drawer_layout),toolbar); 
} 

@Override 
public void onClick(View v) { 
    switch(v.getId()){ 
     case R.id.button: 
      startActivity(new Intent(this, Profile.class)); 
      break; 

     case R.id.tv_registerLink: 
      startActivity(new Intent(this, SubMaterialTst.class)); 
      break; 
    } 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    int id=item.getItemId(); 
    if(id== R.menu.menu_main) { 
     Toast.makeText(MainActivity.this, "you just clicked option settings", Toast.LENGTH_SHORT).show(); 
     return true; 
    } 

     if(id==R.id.navigate){ 
      startActivity(new Intent(this, SubMaterialTst.class)); 

    } 
    return super.onOptionsItemSelected(item); 
} 

}

+0

请分享您的日志 –

+4

问题是不是在您张贴的代码。在这里没有机会调用'findViewById()'on的行为为null。猜测你的片段中有'getActivity()。findViewById()'之类的东西,并且在片段被连接之前调用得太早。 – laalto

+0

你的观点在哪里?在片段或活动? – walkmn

回答

0

你的问题是在这里:containerView=getActivity().findViewById(fragmentId);

的观点是找不到的。请检查这个变量fragmentId,所以你通过这种方法:public void setUp(int fragmentId , DrawerLayout drawerLayout, Toolbar toolbar)

+0

我不知道如何解决它..因为我是一个先辈,请帮我解决。 –

相关问题