2

我的应用程序中有 2 个片段,Fragment1并且Fragment2. 两者都使用不同的布局,称为content_view1and 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>


现在您看到两种布局都有一个 textView 具有相同id的 .
当我运行这个应用程序时,fragment1TextView有文本“hai”,fragment2TextView有文本“”。但我期待的是,fragment1TextView应该有文本“Hello”,fragment2TextView应该有文本“hai”。

好的,现在我将TextViewid更改content_view2.xmlhaiTextView2。也做了同样的 Fragment2.java事情。现在该应用程序按我的预期完美运行。
现在我的问题是:
1)为什么当我保持两个TextViewid 相同时我没有得到预期的输出?
2) 为什么我不能在这里使用相同的 ID?

4

2 回答 2

10

1) 为什么当我保持两个 TextView id 相同时,我没有得到预期的输出?

2) 为什么我不能在这里使用相同的 ID?

这是因为这条线:

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

问题是该findViewById()方法将返回带有提供的 id 的 a 的第一次出现View(它也不区分两个片段的布局),因此当您在第一个或第二个片段中设置文本TextView时set 是第一个(第二个片段中的那个保持不变)。

另一方面,当您使用不同的 id 时,TextViews将选择正确的 ID。

您应该避免Fragment使用Activity引用查找视图,片段应设计为松散耦合的组件(当您可以简单地使用时,使用活动查找片段的视图没有任何意义getView().findViewById(etc))。此外,您应该真正避免使用setRetainInstance()with 中使用的片段ViewPager

于 2013-04-28T14:10:33.107 回答
0

要在视图寻呼机的不同页面上获得具有相同 ID 的所需结果,您可以使用类似这样的东西

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

于 2016-10-28T15:23:01.780 回答