Android在FragmentPagerAdapter中的Fragment中设置TextView文本

时间:2014-07-03 16:37:18

标签: android android-fragments android-viewpager android-fragmentactivity

这个让我疯了。基本上,我想创建一个ViewPager并为其添加一些Fragment。然后,我想要做的就是在Fragment的{​​{1}}之一中设置一个值。我可以添加TextView s罚款,然后他们会附上,但是当我转到第FragmentfindViewById()之一的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);
    }
}

4 个答案:

答案 0 :(得分:5)

TextView位于片段布局中,而不是导致NPE的ViewPagersPagerAdapter。现在,您有两个选择。

  • 第一个是最简单的,您应该简单地移动代码,将文本更改为相应的片段类,在这种情况下为FragmentA。
  • 其次,您可以将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时,它不会找到它。

尝试这样的事情:

  1. 添加&#34;标记&#34;添加它们时的碎片

  2. 使用someFragment = getSupportFragmentManager().findFragmentByTag("your_fragment_tag")

  3. 获取片段的视图 fragmentView = someFragment.getView();

  4. 最后找到你的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;。