android.view.View.findViewById(int) 空对象引用 (Android Lint)
android.view.View.findViewById(int) on a null object reference (Android Lint)
我有问题。我在 android 工作室 运行 Lint 修复了我的应用程序的某些部分,但此应用程序无法启动。它写道:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.cewe.martin.cewetracking/com.cewe.martin.cewetracking.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2778)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
我也找不到,问题出在哪里。我无法撤消,因为有一些更改的文件,所以我尝试删除对我来说不常见的部分,但它仍然无法启动。这是 MainActivity 的 onCreate 方法:
public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
private DrawerLayout drawer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
drawer = findViewById(R.id.drawer_layout);
NavigationView navigationView = findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.addDrawerListener(toggle);
toggle.syncState();
if (savedInstanceState == null) {
Log.d("START","DO IFU");
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new ScanFragment()).commit();
Log.d("START","ZA GETSUPP");
navigationView.setCheckedItem(R.id.nav_scan);
}
}
可以看到Log.d。第一个 "DO IFU" 显示,第二个不显示,所以我认为它可能在 ScanFragment() 中。代码在这里:
public class ScanFragment extends Fragment {
private final EditText rucneKod = (EditText) getView().findViewById(R.id.numberInput);
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
final View view = inflater.inflate(R.layout.fragment_scan, container, false);
Button skenovaciTlacitko = view.findViewById(R.id.button2);
skenovaciTlacitko.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
zapnoutSkener();
}
});
Button rucne = view.findViewById(R.id.button3);
View.OnFocusChangeListener ofcListener = new MyFocusChangeListener();
rucneKod.setOnFocusChangeListener(ofcListener);
final InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
rucne.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (rucneKod.getText().length() != 0) {
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
odeslat(rucneKod.getText().toString());
} else {
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
Snackbar snackbar = Snackbar.make(view, R.string.pozadovanKod, Snackbar.LENGTH_LONG);
View sbView = snackbar.getView();
TextView textView = sbView.findViewById(android.support.design.R.id.snackbar_text);
textView.setTextColor(Color.YELLOW);
snackbar.show();
}
}
});
return view;
}
有人可以看到有问题的代码吗?谢谢
private final EditText rucneKod = (EditText)
getView().findViewById(R.id.numberInput);
导致 NPE。把它放在 OnCreateView
里面,用 view
替换 getView()
我认为问题出在这里:
private final EditText rucneKod = (EditText) getView().findViewById(R.id.numberInput);
您应该在 fragment 的布局膨胀之后立即在 onCreateView 中调用 findViewById。
getView()
fragment构造时为null,调用onCreateView前初始化存储属性
getView() return the view returned by onCreateView(LayoutInflater,
ViewGroup, Bundle))
这样做:private final EditText rucneKod = (EditText) getView().findViewById(R.id.numberInput);
它在onCreateView
函数之前调用了getView,它会是null,这是正常的,
尝试在 onCreateView
函数中移动实例化
希望对您有所帮助
我有问题。我在 android 工作室 运行 Lint 修复了我的应用程序的某些部分,但此应用程序无法启动。它写道:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.cewe.martin.cewetracking/com.cewe.martin.cewetracking.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2778)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
我也找不到,问题出在哪里。我无法撤消,因为有一些更改的文件,所以我尝试删除对我来说不常见的部分,但它仍然无法启动。这是 MainActivity 的 onCreate 方法:
public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
private DrawerLayout drawer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
drawer = findViewById(R.id.drawer_layout);
NavigationView navigationView = findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.addDrawerListener(toggle);
toggle.syncState();
if (savedInstanceState == null) {
Log.d("START","DO IFU");
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new ScanFragment()).commit();
Log.d("START","ZA GETSUPP");
navigationView.setCheckedItem(R.id.nav_scan);
}
}
可以看到Log.d。第一个 "DO IFU" 显示,第二个不显示,所以我认为它可能在 ScanFragment() 中。代码在这里:
public class ScanFragment extends Fragment {
private final EditText rucneKod = (EditText) getView().findViewById(R.id.numberInput);
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
final View view = inflater.inflate(R.layout.fragment_scan, container, false);
Button skenovaciTlacitko = view.findViewById(R.id.button2);
skenovaciTlacitko.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
zapnoutSkener();
}
});
Button rucne = view.findViewById(R.id.button3);
View.OnFocusChangeListener ofcListener = new MyFocusChangeListener();
rucneKod.setOnFocusChangeListener(ofcListener);
final InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
rucne.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (rucneKod.getText().length() != 0) {
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
odeslat(rucneKod.getText().toString());
} else {
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
Snackbar snackbar = Snackbar.make(view, R.string.pozadovanKod, Snackbar.LENGTH_LONG);
View sbView = snackbar.getView();
TextView textView = sbView.findViewById(android.support.design.R.id.snackbar_text);
textView.setTextColor(Color.YELLOW);
snackbar.show();
}
}
});
return view;
}
有人可以看到有问题的代码吗?谢谢
private final EditText rucneKod = (EditText)
getView().findViewById(R.id.numberInput);
导致 NPE。把它放在 OnCreateView
里面,用 view
getView()
我认为问题出在这里:
private final EditText rucneKod = (EditText) getView().findViewById(R.id.numberInput);
您应该在 fragment 的布局膨胀之后立即在 onCreateView 中调用 findViewById。
getView()
fragment构造时为null,调用onCreateView前初始化存储属性
getView() return the view returned by onCreateView(LayoutInflater, ViewGroup, Bundle))
这样做:private final EditText rucneKod = (EditText) getView().findViewById(R.id.numberInput);
它在onCreateView
函数之前调用了getView,它会是null,这是正常的,
尝试在 onCreateView
函数中移动实例化
希望对您有所帮助