gpt4 book ai didi

android - 在 ViewPager 中引用 EditText 会产生空指针异常

转载 作者:行者123 更新时间:2023-11-30 03:36:40 25 4
gpt4 key购买 nike

我正在尝试做的事情:

让用户在 3 个不同的 fragment 上输入数据,然后在第 4 个 fragment 上,用户将在提交到数据库之前检查输入到前 3 个 fragment 中的所有数据。

我遇到的问题:

我尝试设置或从 EditText 获取的每个方法都会创建一个 NullPointerException

我的问题:

对于我正在尝试做的事情,从一个 fragment 调用 EditText 的文本值,并在页面更改时在另一个 fragment 的 EditText 中设置该文本的正确方法是什么?

注意事项:

我已将代码简化为仅在每个 fragment 上反射(reflect)一个 EditText,以便于复制和剖析代码。

代码:

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.widget.EditText;

public class SwipeEnterResults extends FragmentActivity {

ResultsPagerAdapter mResultsPagerAdapter;
ViewPager mViewPager;

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.swipe_enter_results);

mResultsPagerAdapter = new ResultsPagerAdapter(getSupportFragmentManager());
mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setAdapter(mResultsPagerAdapter);
}

public void onResume() {
super.onResume();
//Declare EditText(s)

final EditText txt1= (EditText) mViewPager.findViewById(R.id.txt1);
final EditText txt2= (EditText) mViewPager.findViewById(R.id.txt2);
final EditText txt3= (EditText) mViewPager.findViewById(R.id.txt3);

final EditText rvw1= (EditText) mViewPager.findViewById(R.id.rvw1);
final EditText rvw2= (EditText) mViewPager.findViewById(R.id.rvw2);
final EditText rvw3= (EditText) mViewPager.findViewById(R.id.rvw3);


mViewPager.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int position) {

rvw1.setText(txt1.getText().toString());
rvw2.setText(txt2.getText().toString());
rvw3.setText(txt3.getText().toString());
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) { }
@Override
public void onPageScrollStateChanged(int arg0) { }
});
}

public class ResultsPagerAdapter extends FragmentPagerAdapter{

public ResultsPagerAdapter(FragmentManager fm) {
super(fm);
}

@Override
public Fragment getItem(int position) {
Fragment f = new Fragment();

switch (position) {
case 0:
f = new Swipe1();
break;
case 1:
f = new Swipe2();
break;
case 2:
f = new Swipe3();
break;
case 3:
f = new SwipeReviewResults();
break;
}

return f;
}

@Override
public int getCount() {
return 4;
}

@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return getString(R.string.str1);
case 1:
return getString(R.string.str2);
case 2:
return getString(R.string.str3);
case 3:
return getString(R.string.strReview);
default:
return "Page " + (position + 1);
}
}
}
}

最佳答案

一些事情:

  1. Activity 中的 EditText 是否可能为空,因为您试图在适配器创建所有 fragment 及其 View 之前引用它们(通过它们在 View 中的 ID)?此外,似乎每次调用 ResultsPagerAdaptergetItem 方法时,都会创建一个具有自己 View 的新 fragment ...因此您的 Activity 可能引用了陈旧的创建新 fragment View 时的 EditText View 。

  2. 您的 Activity 不必关心每个 fragment 中存在哪些 View 以及围绕它们的逻辑。最好让每个 fragment 处理对其自己 View 的引用并管理它们周围的逻辑。你可以做的是有一个中央缓存,其中 EditTexts 值由 fragment 存储/检索。例如,在 Swipe fragment 的 onPause() 方法中,您可以将其 EditText 值存储在缓存中,并在 onResume() SwipeReviewResults fragment 的方法可以从缓存中提取所有更新的 EditText 值。

  3. 在适配器的 switch 语句中,您应该使用 default block 返回一个空的 new Fragment() 而不是不必要地预先创建它.

希望对您有所帮助。

关于android - 在 ViewPager 中引用 EditText 会产生空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16574446/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com