这个让我疯了。基本上,我想创建一个ViewPager
并为其添加一些Fragment
。然后,我想要做的就是在Fragment
的{{1}}之一中设置一个值。我可以添加TextView
s罚款,然后他们会附上,但是当我转到第Fragment
位findViewById()
之一的TextView
时,它会抛出Fragment
}}。我,在我的生活中,无法弄清楚原因。
到目前为止,这是我的代码,请告诉我是否需要更多代码。
NullPointerException
我创建的所有public class SheetActivity extends FragmentActivity {
// /////////////////////////////////////////////////////////////////////////
// Variable Declaration
// /////////////////////////////////////////////////////////////////////////
private ViewPager viewPager;
private PagerTitleStrip titleStrip;
private String type;
private FragmentPagerAdapter fragmentPager; //UPDATE
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sheet);
viewPager = (ViewPager) findViewById(R.id.viewPager);
titleStrip = (PagerTitleStrip) findViewById(R.id.viewPagerTitleStrip);
// Determine which type of sheet to create
Intent intent = getIntent();
this.type = intent.getStringExtra("type");
FragmentManager manager = getSupportFragmentManager();
switch (type) {
case "1":
viewPager.setAdapter(new InstallAdapter(manager));
break;
case "2":
viewPager.setAdapter(new InstallAdapter(manager));
break;
}
fragmentPager = (FragmentPagerAdapter) viewPager.getAdapter(); //UPDATE
}
@Override
public void onResume() {
super.onResume();
fragmentPager.getItem(0).setText("something"); //UPDATE
}
class MyAdapter extends FragmentPagerAdapter {
private final String[] TITLES = { "Title1", "Title2" };
private final int PAGE_COUNT = TITLES.length;
private ArrayList<Fragment> FRAGMENTS = null;
public MyAdapter(FragmentManager fm) {
super(fm);
FRAGMENTS = new ArrayList<Fragment>();
FRAGMENTS.add(new FragmentA());
FRAGMENTS.add(new FragmentB());
}
@Override
public Fragment getItem(int pos) {
return FRAGMENTS.get(pos);
}
@Override
public int getCount() {
return PAGE_COUNT;
}
@Override
public CharSequence getPageTitle(int pos) {
return TITLES[pos];
}
}
}
只覆盖了Fragment
方法,因此我可以显示正确的XML布局。除此之外,他们是'股票'。为什么我不能与任何onCreateView()
s中的元素进行交互?
更新
那么做这样的事情?
Fragment
片段A的XML布局
public class FragmentA extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle inState) {
return inflater.inflate(R.layout.fragment_a, container, false);
}
public void setText(String text) {
TextView t = (TextView) getView().findViewById(R.id.someTextView); //UPDATE
t.setText(text);
}
}
答案 0 :(得分:5)
TextView
位于片段布局中,而不是导致NPE的ViewPagers
或PagerAdapter
。现在,您有两个选择。
其次,您可以将TextView
设置为FragmentA静态,以便其他类可以访问它。所以你的代码看起来像这样:
....
TextView myText;
@Override
public View onCreateView(....) {
myLayout = ....;
myText = myLayout.findViewById(yourID);
....
}
然后你会改变其他地方的文字(如果真的有必要的话):
FragmentA.myText.setText("new text");
解释方法2
在片段中使用以下内容。
public static void setText(String text) {
TextView t = (TextView) getView().findViewById(R.id.someTextView);
t.setText(text);
}
然后更改文字,如:
FragmentA.setText("Lulz");
答案 1 :(得分:4)
除非您计划在运行时更改值,否则可以将值作为参数传递给片段。我使用Bundle并将其作为args传递给Fragment,然后从它的args中检索它。 More info here。如果实现了这一点,那么新Fragment的实例化可能如下所示:
public InstallAdapter(FragmentManager fm) {
super(fm);
FRAGMENTS = new ArrayList<Fragment>();
FRAGMENTS.add(FragmentA.newInstance("<text to set to the TextView>"));
FRAGMENTS.add(FragmentB.newInstance("<text to set to the TextView>"));
}
但是,如果您计划在运行时更新值(它将在用户运行应用程序时更改),那么您希望使用接口来管理片段与活动之间的通信。 Info here。这就是它的样子:
//Declare your values for activity;
ISetTextInFragment setText;
ISetTextInFragment setText2;
...
//Add interface
public interface ISetTextInFragment{
public abstract void showText(String testToShow);
}
...
//your new InstallAdapter
public InstallAdapter(FragmentManager fm) {
super(fm);
FRAGMENTS = new ArrayList<Fragment>();
Fragment fragA = new FragmentA();
setText= (ISetTextInFragment)fragA;
FRAGMENTS.add(fragA);
Fragment fragB = new FragmentB();
setText2= (ISetTextInFragment)fragB;
FRAGMENTS.add(fragB);
}
//then, you can do this from your activity:
...
setText.showText("text to show");
...
它将更新片段中的文本视图。
虽然它可以“更容易”完成,但建议使用这些方法,因为它们可以减少错误的机会,并使代码更具可读性和可维护性。
编辑:这就是你的片段应该是什么样的(修改你的代码):
public class FragmentA extends Fragment implements ISetTextInFragment {
TextView myTextView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle inState) {
View v = inflater.inflate(R.layout.fragment_a, container, false);
myTextView = (TextView)v.findViewbyId(R.id.someTextView)
return v;
}
@Override
public void showText(String text) {
myTextView.setText(text);
}
}
如果在那之后你仍然得到一个空指针异常,你的TextView不在我需要的地方,即在R.layout.fragment_a文件中,它需要位于那里。 当然,除非您在片段完成加载之前调用接口方法。
答案 2 :(得分:1)
这一行:
TextView t = (TextView) findViewById(R.id.someTextViewInFragmentA);
正在您的ParentActivity中查找视图。当然,当你得到你的NPE时,它不会找到它。
尝试这样的事情:
添加&#34;标记&#34;添加它们时的碎片
使用someFragment = getSupportFragmentManager().findFragmentByTag("your_fragment_tag")
获取片段的视图
fragmentView = someFragment.getView();
最后找到你的TextView
并设置文字
TextView t = (TextView) fragmentView.findViewById(R.id.someTextViewInFragmentA);
t.setText("some text");
答案 3 :(得分:0)
如何更改此行
TextView t = (TextView) getView().findViewById(R.id.someTextView); //UPDATE
到
TextView t = (TextView) getActivity().findViewById(R.id.someTextView); //UPDATE
然后你可以尝试更新&#34; t&#34;使用.setText(&#34; some_string&#34;)在&#34; SheetActivity&#34;。