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

相關問題