我想阅读NFC标签,当活动在前台时,我能够这样做。但是,当活动不在前台并且检测到NFC标签时,活动无法恢复并引发如下异常:
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
我正在使用Viewpager和FragmentPagerAdapter来设置标签。所有这些设置都在onCreate()方法中完成,如下所示:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
/*assert getSupportActionBar() != null;
getSupportActionBar().setDisplayHomeAsUpEnabled(true);*/
viewPager = (ViewPager) findViewById(R.id.viewpager);
setupViewPager(viewPager);
tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
mWriteFragmentIndex = 1;
mReadFragmentIndex = 0;
mNfcAdapter = NfcAdapter.getDefaultAdapter(MainActivity.this);
mPendingIntent = PendingIntent.getActivity(MainActivity.this, 0,
new Intent(MainActivity.this, MainActivity.class).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
}
片段寻呼机适配器如下所示:
private void setupViewPager(ViewPager viewPager) {
adapter = new ViewPagerAdapter(getSupportFragmentManager());
mReadFragment = new ReadFragment();
adapter.addFragment(mReadFragment, "Read");
mWriteFragment = new WriteFragment();
adapter.addFragment(mWriteFragment, "Write");
viewPager.setAdapter(adapter);
}
class ViewPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();
public ViewPagerAdapter(FragmentManager manager) {
super(manager);
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
public void addFragment(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitleList.get(position);
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
Fragment fragment = (Fragment) super.instantiateItem(container, position);
if(fragment instanceof ReadFragment){
mReadFragment = (ReadFragment) fragment;
}
if(fragment instanceof WriteFragment){
mWriteFragment = (WriteFragment) fragment;
}
return fragment;
}
}
当活动不在前台时检测到NFC标签时,我在onResume方法中收到NFC意图。然后,我调用片段中的方法来读取标记。
private void readIfTag(Intent intent){
if(NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction()) || NfcAdapter.ACTION_TECH_DISCOVERED.equals(intent.getAction())){
if(mReadFragment != null) {
mReadFragment.readTag(intent);
if(viewPager.getCurrentItem() != mReadFragmentIndex) {
viewPager.setCurrentItem(mReadFragmentIndex);
}
}
}
}
正确读取标记(我可以看到从日志中的标记中检索到的文本)但是当片段尝试更新其视图时会抛出异常。
我可以从日志中看到,PagerAdapter的instantiateItem()以及片段的onCreateView()在readIfTag()方法之后执行,这就是片段视图为空的原因。我不明白为什么这是/我犯了错误的地方。
对代码的任何部分的任何帮助表示赞赏。感谢。
更新 下面给出了被调用的片段中的方法。请注意,mInstructionTextView.setText(&#34;&#34;)是抛出异常的行。换句话说,片段以某种方式存在但其视图不存在。
public void readTag(Intent intent) {
String action = intent.getAction();
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) {
String type = intent.getType();
if (MIME_TEXT_PLAIN.equals(type)) {
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
Ndef ndef = Ndef.get(tag);
if (ndef == null) {
// NDEF is not supported by this Tag.
return;
}
NdefMessage ndefMessage = ndef.getCachedNdefMessage();
NdefRecord[] records = ndefMessage.getRecords();
for (NdefRecord ndefRecord : records) {
if (ndefRecord.getTnf() == NdefRecord.TNF_WELL_KNOWN && Arrays.equals(ndefRecord.getType(), NdefRecord.RTD_TEXT)) {
try {
String result = readText(ndefRecord);
mInstructionTextView.setText("");
答案 0 :(得分:1)
我设法通过使用Activity和Fragment之间的接口来解决问题。
问题是访问Fragment视图的方法是在FragmentPagerAdapter完全实例化Fragments之前执行的(确切地说是他们的视图)。
因此,我所做的是在Frag中创建一个Activity必须实现的接口。在片段的onCreateView()结束时,我在界面中调用了该方法。在这个方法的实现中(在Activity中),我调用了读取标记的方法。
答案 1 :(得分:0)
也许尝试调用你在
中的onResume中调用的代码void onResumeFragments()
并引用纪录
这是onResume()的片段定向版本,您可以覆盖该版本以在其片段恢复的同一点执行Activity中的操作。
答案 2 :(得分:0)
不要将代码放入onCreate
!在onCreateView()之前调用onCreate()
。因此您无法在onCreate()
中获取视图。