1

我在我的应用程序中有两个片段,Fragment1Fragment2。两者都使用称为content_view1content_view2的不同布局。我把这两个片段放入ViewPager。现在看到代码:
MainActivity.java为什么我不能在ViewPager中的不同布局中使用相同的ID为

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
当我运行这个应用程序时,fragment1的TextView有文本“hai”,而fragment2的TextView有文本“”。但我期望的是,片段1的TextView应该有文本“你好”,而片段2的TextView应该有文本“海”。

好吧,我现在将TextView的编号content_view2.xml更改为haiTextView2Fragment2.java也一样。现在应用程序按照我的预期完美工作。
现在我的问题:
1)为什么我我以前不得到预期的放出来的时候我都保持了TextView ID一样吗?
2)为什么我不能在这里使用相同的ID?

回答

6

1)为什么我我以前不得到预期的放出来的时候我都保持TextView的 ID一样吗?

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

,这是因为这条线的情况发生:

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

的问题是findViewById()方法将返回第一出现一个View与所提供的ID(它也不会在区分这两个片段的布局),所以当你设置第一个或第二个片段中的文本时,TextView被设置为第一个(第二个片段中的一个保持不变)。

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

你应该避免找Fragment的使用Activity参考意见,片段应设计为松耦合的组件(它没有任何意义采用活动时,你可以简单地使用getView().findViewById(etc)寻找片段的意见)。 另外,您应该避免使用以及ViewPager中使用的片段。

+0

为什么我应该避免'setRetainInstance()' – 2013-04-28 14:34:55

+0

非常感谢。 'getView()'对我来说是非常有用的信息。 – 2013-04-28 14:38:54

+1

@VishalVijay'setRetaininstance(true)'将在配置更改中保留该片段,另一方面'ViewPager'在轮换更改后自行处理片段。在任何情况下,该方法都不能与碎片一起使用。 – Luksprog 2013-04-28 14:43:46

0

要获得相同的ID在视图寻呼机的不同页面所期望的结果,您可以使用类似这样

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

相关问题