web-dev-qa-db-ja.com

Android FragmentPagerAdapterにあるFragmentのTextViewのテキストを設定します

これは私にナッツを運転しています。基本的に、ViewPagerを作成し、それにいくつかのFragmentsを追加します。次に、私がやりたいのは、FragmentTextViewsのいずれかに値を設定することです。私はFragmentsを追加して細かくすることができますが、最初のTextViewFragmentsの1つをfindViewById()に移動すると、 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];
        }
    }
}
_

作成したすべてのFragmentsはonCreateView()メソッドのみがオーバーライドされているため、適切なXMLレイアウトを表示できます。それ以外は「在庫」です。 Fragmentsの要素を操作できないのはなぜですか?

更新:

それで、このようなことをしますか?

_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);
    }
}
_

フラグメントAのXMLレイアウト

_<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:orientation="vertical" >

    <TextView
        Android:id="@+id/someTextView"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:layout_weight="1"
        Android:textSize="22sp" />

</LinearLayout>
_
8
Josh I

実行時に値を変更することを計画しているのでない限り、値をパラメーターとしてフラグメントに渡すことができます。これは、バンドルを使用してそれを引数としてFragmentに渡し、その後、その引数から取得します。 詳細はこちら 。これを実装すると、新しいFragmentsのインスタンス化は次のようになります。

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>"));
        }

ただし、実行時に値を更新することを計画している場合(ユーザーがアプリを実行すると値が変わる)、インターフェースを使用してフラグメントとアクティビティ間の通信をチャネリングする必要があります。 ここに情報 。これは次のようになります。

//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);
    }
}

その後もnullポインター例外が発生する場合は、TextViewが必要な場所、つまりR.layout.fragment_aファイルに配置されておらず、そこに配置する必要があります。 もちろん、フラグメントのロードが完了する前にインターフェースメソッドを呼び出していない限り

4
C0D3LIC1OU5

TextViewは、NPEを引き起こしているViewPagersまたはPagerAdapterではなく、フラグメントレイアウトにあります。現在、2つのオプションがあります。

  • 最初の方法が最も簡単です。テキストを変更するコードを、対応するフラグメントのクラス(この場合はFragmentA)に単純に移動する必要があります。
  • 次に、TextViewをFragmentA staticにして、他のクラスからアクセスできるようにすることができます。したがって、コードは次のようになります。

     ....
     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");
5
Aashir

この行:

_TextView t = (TextView) findViewById(R.id.someTextViewInFragmentA);
_

parentActivityでビューを探しています。もちろん、それは見つかりません。それが、NPEを取得するときです。

次のようなものを試してください:

  1. フラグメントを追加するときに、フラグメントに「タグ」を追加します

  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");

1
Carlos J

この行を変更する方法

TextView t = (TextView) getView().findViewById(R.id.someTextView);  //UPDATE

TextView t = (TextView) getActivity().findViewById(R.id.someTextView);  //UPDATE

次に、 "SheetActivity"内の.setText( "some_string")で "t"を更新しようとすることができます。

0
Artis JIANG