继续在 findViewById 上获取空引用
Keep getting null reference on findViewById
我正在尝试在 Android Studio 中使用 ImageButton 打开和关闭导航抽屉。我的困难是我无法使用某些方法,因为我在一个零散的子类中。这是我遇到的错误。
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference
at dadump.test.HomeFragment.onCreateView(HomeFragment.java:27)
这是导致错误的我的代码。我的家里 activity 也有一个名为 open() 的方法,它只有一行:mDrawerLayout.openDrawer(Gravity.LEFT);
。
public class HomeFragment extends Fragment {
private DrawerLayout mDrawerLayout;
private ActionBarDrawerToggle mToggle;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View View = inflater.inflate(R.layout.fragment_home, null);
ImageButton button = (ImageButton)getView().findViewById(R.id.button_settings);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(android.view.View view) {
((MainActivity)getActivity()).open();
}
});
return View;
}
}
主要Class:
public class MainActivity extends AppCompatActivity implements BottomNavigationView.OnNavigationItemSelectedListener {
private DrawerLayout mDrawerLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BottomNavigationView navigation =findViewById(R.id.navigation);
navigation.setOnNavigationItemSelectedListener(this);
setupBottomNavigationView();
loadFragment(new HomeFragment());
}
private void setupBottomNavigationView(){
BottomNavigationViewEx bottomNavigationViewEx = (BottomNavigationViewEx)findViewById(R.id.navigation);
BottomNavigationViewHelper.setupBottomNavigationView(bottomNavigationViewEx);
}
private boolean loadFragment(android.support.v4.app.Fragment fragment) {
if(fragment != null){
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, fragment).commit();
return true;
}
return false;
}
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
android.support.v4.app.Fragment fragment = null;
switch(item.getItemId()){
case R.id.ic_home:
fragment = new HomeFragment();
break;
case R.id.ic_directMessage:
fragment = new DirectMessageFragment();
break;
case R.id.ic_newPost:
fragment = new NewPostFragment();
break;
case R.id.ic_notifications:
fragment = new NotificationsFragment();
break;
case R.id.ic_userProfile:
fragment = new UserProfileFragment();
break;
}
return loadFragment(fragment);
}
public void open() {
mDrawerLayout.openDrawer(Gravity.LEFT);
}
}
In onCreateView
getView()
尚未初始化。这就是创建此问题的原因。尝试使用 view
而不是 getView()
。如果您想从 getView()
获取数据,请将此代码移至 onViewCreated()
@Override
方法。
View view = inflater.inflate(R.layout.fragment_home, null);
ImageButton button = (ImageButton)view.findViewById(R.id.button_settings);
这将解决您的问题。
我正在尝试在 Android Studio 中使用 ImageButton 打开和关闭导航抽屉。我的困难是我无法使用某些方法,因为我在一个零散的子类中。这是我遇到的错误。
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference at dadump.test.HomeFragment.onCreateView(HomeFragment.java:27)
这是导致错误的我的代码。我的家里 activity 也有一个名为 open() 的方法,它只有一行:mDrawerLayout.openDrawer(Gravity.LEFT);
。
public class HomeFragment extends Fragment {
private DrawerLayout mDrawerLayout;
private ActionBarDrawerToggle mToggle;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View View = inflater.inflate(R.layout.fragment_home, null);
ImageButton button = (ImageButton)getView().findViewById(R.id.button_settings);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(android.view.View view) {
((MainActivity)getActivity()).open();
}
});
return View;
}
}
主要Class:
public class MainActivity extends AppCompatActivity implements BottomNavigationView.OnNavigationItemSelectedListener {
private DrawerLayout mDrawerLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BottomNavigationView navigation =findViewById(R.id.navigation);
navigation.setOnNavigationItemSelectedListener(this);
setupBottomNavigationView();
loadFragment(new HomeFragment());
}
private void setupBottomNavigationView(){
BottomNavigationViewEx bottomNavigationViewEx = (BottomNavigationViewEx)findViewById(R.id.navigation);
BottomNavigationViewHelper.setupBottomNavigationView(bottomNavigationViewEx);
}
private boolean loadFragment(android.support.v4.app.Fragment fragment) {
if(fragment != null){
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, fragment).commit();
return true;
}
return false;
}
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
android.support.v4.app.Fragment fragment = null;
switch(item.getItemId()){
case R.id.ic_home:
fragment = new HomeFragment();
break;
case R.id.ic_directMessage:
fragment = new DirectMessageFragment();
break;
case R.id.ic_newPost:
fragment = new NewPostFragment();
break;
case R.id.ic_notifications:
fragment = new NotificationsFragment();
break;
case R.id.ic_userProfile:
fragment = new UserProfileFragment();
break;
}
return loadFragment(fragment);
}
public void open() {
mDrawerLayout.openDrawer(Gravity.LEFT);
}
}
In onCreateView
getView()
尚未初始化。这就是创建此问题的原因。尝试使用 view
而不是 getView()
。如果您想从 getView()
获取数据,请将此代码移至 onViewCreated()
@Override
方法。
View view = inflater.inflate(R.layout.fragment_home, null);
ImageButton button = (ImageButton)view.findViewById(R.id.button_settings);
这将解决您的问题。