これは私にナッツを運転しています。基本的に、ViewPager
を作成し、それにいくつかのFragment
sを追加します。次に、私がやりたいのは、Fragment
のTextView
sのいずれかに値を設定することです。私はFragment
sを追加して細かくすることができますが、最初のTextView
のFragment
sの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];
}
}
}
_
作成したすべてのFragment
sはonCreateView()
メソッドのみがオーバーライドされているため、適切なXMLレイアウトを表示できます。それ以外は「在庫」です。 Fragment
sの要素を操作できないのはなぜですか?
更新:
それで、このようなことをしますか?
_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>
_
実行時に値を変更することを計画しているのでない限り、値をパラメーターとしてフラグメントに渡すことができます。これは、バンドルを使用してそれを引数として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ファイルに配置されておらず、そこに配置する必要があります。 もちろん、フラグメントのロードが完了する前にインターフェースメソッドを呼び出していない限り
TextView
は、NPEを引き起こしているViewPagers
またはPagerAdapter
ではなく、フラグメントレイアウトにあります。現在、2つのオプションがあります。
次に、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");
この行:
_TextView t = (TextView) findViewById(R.id.someTextViewInFragmentA);
_
parentActivityでビューを探しています。もちろん、それは見つかりません。それが、NPEを取得するときです。
次のようなものを試してください:
フラグメントを追加するときに、フラグメントに「タグ」を追加します
someFragment = getSupportFragmentManager().findFragmentByTag("your_fragment_tag")
を使用します
フラグメントのビューを取得するfragmentView = someFragment.getView();
そして最後にTextView
を見つけてテキストを設定します
TextView t = (TextView) fragmentView.findViewById(R.id.someTextViewInFragmentA); t.setText("some text");
この行を変更する方法
TextView t = (TextView) getView().findViewById(R.id.someTextView); //UPDATE
に
TextView t = (TextView) getActivity().findViewById(R.id.someTextView); //UPDATE
次に、 "SheetActivity"内の.setText( "some_string")で "t"を更新しようとすることができます。