2

アプリケーションに 2 つのフラグメントがFragment1あり、Fragment2. どちらも と と呼ばれる異なるレイアウトを使用していcontent_view1ますcontent_view2。そして、両方のフラグメントを に入れましたViewPager。コードを見てください:
MainActivity.java

public class MainActivity extends FragmentActivity {

public ViewPager vp;
FragmentAdapter fragmentAdapter;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    vp = new ViewPager(this);
    vp.setId("VP".hashCode());
    fragmentAdapter = new FragmentAdapter(
            getSupportFragmentManager());
    vp.setAdapter(fragmentAdapter);
    setContentView(vp);
    vp.setCurrentItem(0);
}

}


Fragment1.java

public class Fragment1 extends Fragment {

MainActivity mainActivity;

public Fragment1() {
    setRetainInstance(true);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    mainActivity=(MainActivity)getActivity();
    return inflater.inflate(R.layout.content_view1, null);
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    ((TextView)mainActivity.findViewById(R.id.haiTextView)).setText("Hello");
}
}


Fragment2.java

public class Fragment2 extends Fragment {

MainActivity mainActivity;

public Fragment2() {
    setRetainInstance(true);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    mainActivity=(MainActivity)getActivity();
    return inflater.inflate(R.layout.content_view2, null);
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    ((TextView)mainActivity.findViewById(R.id.haiTextView)).setText("Hai");
}
}

FragmentAdapter.java

public class FragmentAdapter extends FragmentPagerAdapter {

private ArrayList<Fragment> mFragments;

public FragmentAdapter(FragmentManager fm) {
    super(fm);
    mFragments = new ArrayList<Fragment>();
    mFragments.add(new Fragment1());
    mFragments.add(new Fragment2());
}

@Override
public int getCount() {
    return mFragments.size();
}

@Override
public Fragment getItem(int position) {
    return mFragments.get(position);
}
}


content_view1.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_vertical|center_horizontal" >

<TextView
    android:id="@+id/haiTextView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textIsSelectable="true" />

</FrameLayout>


content_view2.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_vertical|center_horizontal" >

<TextView
    android:id="@+id/haiTextView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textIsSelectable="true" />

</FrameLayout>


これで、両方のレイアウトに同じ .xml を持つ 1 つの textView があることがわかりますid
このアプリケーションを実行すると、fragment1TextViewにはテキスト "hai" が含まれ、fragment2TextViewにはテキスト "" が含まれます。しかし、私が期待しているのは、fragment1 にTextViewはテキスト「Hello」があり、fragment2TextViewにはテキスト「hai」があるはずです。

わかりました のTextViewid をに変更しcontent_view2.xmlましたhaiTextView2。も同じようにしました Fragment2.java。現在、アプリケーションは期待どおりに完全に機能しています。
ここで私の質問: 1) 両方のID を同じ
にすると、期待した出力が得られなかったのはなぜですか? 2) ここで同じ ID を使用できないのはなぜですか? TextView

4

2 に答える 2

10

1) 両方の TextView id を同じにすると、期待される出力が得られなかったのはなぜですか?

2) ここで同じ ID を使用できないのはなぜですか?

これは、次の行が原因で発生しています。

((TextView)mainActivity.findViewById(R.id.haiTextView)).setText("Hai");

問題は、メソッドが提供された id を持つ最初の aをfindViewById()返すことです(2 つのフラグメントのレイアウトも区別しません)。そのため、最初または 2 番目のフラグメントのいずれかにテキストを設定すると、セットは最初のものです(2番目のフラグメントからのものはそのままです)。ViewTextView

一方、異なる ID を使用すると、適切な IDTextViewsが選択されます。

Fragment参照を使用してのビューを探すことは避けてActivityください。フラグメントは、疎結合コンポーネントとして設計する必要があります (単純に を使用できるのに、アクティビティを使用してフラグメントのビューを探すのは意味がありませんgetView().findViewById(etc))。setRetainInstance()また、で使用されるフラグメントでの使用は本当に避けるべきViewPagerです。

于 2013-04-28T14:10:33.107 に答える
0

To get the desired result with same ID's at different page of the view pager, You can use something like this

TextView textView = (TextView) vp.getChildAt(vp.getCurrentItem).findViewById(R.id.haiTextView);

于 2016-10-28T15:23:01.780 に答える