Android 一旦Fragment和ViewPager实现,就无法编辑某些视图
编辑: 通过深入研究,我几乎可以肯定问题在于当我在Android 一旦Fragment和ViewPager实现,就无法编辑某些视图,android,android-fragments,android-viewpager,layout-inflater,Android,Android Fragments,Android Viewpager,Layout Inflater,编辑: 通过深入研究,我几乎可以肯定问题在于当我在FragmentActivity的onCreate()方法中膨胀布局时,ViewPager中膨胀了不同的视图。因此,当我尝试使用xml1.findViewById()访问它们时,它会看到一个不同的视图。如何访问查看页面中使用的视图?查看我的FragmentPagerAdapter看起来,每次滑动超过1次,碎片都会被创建为新对象。我希望所有4个视图都初始化一次。然后每次我调用updateUI时,这四个视图都会立即改变。因此,我可以在所有四个视图之间
FragmentActivity
的onCreate()方法中膨胀布局时,ViewPager中膨胀了不同的视图。因此,当我尝试使用xml1.findViewById()
访问它们时,它会看到一个不同的视图。如何访问查看页面中使用的视图?查看我的FragmentPagerAdapter
看起来,每次滑动超过1次,碎片都会被创建为新对象。我希望所有4个视图都初始化一次。然后每次我调用updateUI
时,这四个视图都会立即改变。因此,我可以在所有四个视图之间滑动,并且它们都是最新更新的
我尝试使用pagerAdapter.getItem(index.getView().findViewById()
,但它返回一个NullPointerException
。在得到异常后,我尝试在片段
类中重写getView()
方法。我在这个方法中只放了returnview
,其中view是onCreateView
方法中返回的视图的保存实例。这导致我的ViewPager显示了4个空白屏幕,可以在其中滑动
我在问题的底部添加了我的FragmentPagerAdapter
实现
结束编辑
我试图通过使用片段来实现。我得到了非常奇怪的结果
private TextView view1a, view1b;
private TextView view2a, view2b;
private TextView view3a, view3b;
private TextView view4a, view4b;
private Spinner spinner1, spinner2, spinner3, spinner4;
private Checkbox check1, check2, check3, check4;
private ViewPager mViewPager;
private View xml1, xml2, xml3, xml4;
public void onCreate( Bundle savedInstanceState ) {
super.onCreate( savedInstanceState );
setContentView( R.layout.main_page );
mViewPager = (ViewPager) findViewById( R.id.pager );
FragmentManager fm = getSupportFragmentManager();
MoreParmsFragmentPagerAdapter pagerAdapter = new MoreParmsFragmentPagerAdapter(fm);
xml1 = LayoutInflater.from( getBaseContext()).inflate( R.layout.xml1, null );
xml2 = LayoutInflater.from( getBaseContext()).inflate( R.layout.xml2, null );
xml3 = LayoutInflater.from( getBaseContext()).inflate( R.layout.xml3, null );
xml4 = LayoutInflater.from( getBaseContext()).inflate( R.layout.xml4, null );
populateSpinners();
updateUI();
}
public void populateSpinners() {
array1Adapter = new ArrayAdapter<String>( this, android.R.layout.simple_spinner_item, res.getStringArray( R.array.array1 ) );
array1Adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner1 = (Spinner) xml1.findViewById(R.id.spinner1);
spinner1.setAdapter(array1Adapter);
array2Adapter = new ArrayAdapter<String>( this, android.R.layout.simple_spinner_item, res.getStringArray( R.array.array2 ) );
array2Adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner2 = (Spinner) xml2.findViewById(R.id.spinner2);
spinner2.setAdapter(array2Adapter);
array3Adapter = new ArrayAdapter<String>( this, android.R.layout.simple_spinner_item, res.getStringArray( R.array.array3 ) );
array3Adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner3 = (Spinner) xml3.findViewById(R.id.spinner3);
spinner3.setAdapter(array3Adapter);
array4Adapter = new ArrayAdapter<String>( this, android.R.layout.simple_spinner_item, res.getStringArray( R.array.array4 ) );
array4Adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner4 = (Spinner) xml4.findViewById(R.id.spinner4);
spinner4.setAdapter(array4Adapter);
}
public void updateUI() {
view1a = (TextView) xml1.findViewById( R.id.view_one_a );
view1b = (TextView) xml1.findViewById( R.id.view_one_b );
view2a = (TextView) xml2.findViewById( R.id.view_two_a );
view2b = (TextView) xml2.findViewById( R.id.view_two_b );
view3a = (TextView) xml3.findViewById( R.id.view_three_a );
view3b = (TextView) xml3.findViewById( R.id.view_three_b );
view4a = (TextView) xml4.findViewById( R.id.view_four_a );
view4b = (TextView) xml4.findViewById( R.id.view_four_b );
// There is work done here to determine what to set
// the different TextViews' text to.
//
// `view**.setText()` is called for all views above with their respective values.
spinner1 = (Spinner) xml1.findViewById( R.id.spinner1 );
spinner2 = (Spinner) xml2.findViewById( R.id.spinner2 );
spinner3 = (Spinner) xml3.findViewById( R.id.spinner3 );
spinner4 = (Spinner) xml4.findViewById( R.id.spinner4 );
// There is work done here to determine what index the Spinners
// should have selected.
//
// `Spinner.setSelection( index ) is called on all spinners.
check1 = (CheckBox) xml1.findViewById( R.id.check1 );
check2 = (CheckBox) xml2.findViewById( R.id.check2 );
check3 = (CheckBox) xml3.findViewById( R.id.check3 );
check4 = (CheckBox) xml4.findViewById( R.id.check4 );
// There is work done here to determine whether or not
// to check the CheckBoxes.
//
// CheckBox.setChecked() is called for all checkboxes.
}
}
第一个问题是微调器
从不填充相应的数组。在我的populateSpinners()
方法中,有LogCat
调用显示了我的期望,但是微调器本身没有填充
第二个问题出现在updateUI()
方法中。所有findViewById()
调用下面的注释是我进行某些计算的地方,以确定在textview
中放置什么文本,将微调器设置为什么索引,以及是否选中复选框。我有LogCat
调用,显示找到的值,它们都是预期值。
调用.setText()、.setSelection()和.setChecked()方法时,不会显示错误,但不会设置任何项。一切都是空白的
第三个问题是最让我困惑的。textView
现在都有唯一的ID。当我第一次尝试实现这个ViewPager
时,我使用updateUI()
方法处理文本视图,而不使用xml*
前缀来调用findViewById()
view1a = (TextView) findViewById( R.id.view_one_a );
view1b = (TextView) findViewById( R.id.view_one_b );
view2a = (TextView) findViewById( R.id.view_two_a );
view2b = (TextView) findViewById( R.id.view_two_b );
view3a = (TextView) findViewById( R.id.view_three_a );
view3b = (TextView) findViewById( R.id.view_three_b );
view4a = (TextView) findViewById( R.id.view_four_a );
view4b = (TextView) findViewById( R.id.view_four_b );
// There is work done here to determine what to set
// the different TextViews' text to.
view**.setText( whatever );
此方法导致出现NullPointerException
,但仅当使用第三和第四页上的文本视图调用.setText()
时才会出现。前两页没有抛出任何异常。所以我把第三页和第四页注释掉了。程序运行后,前两页在正确的文本视图中显示了正确的值。然后我尝试将xml*
添加到findViewById()
方法中,现在没有抛出异常,但根本没有更新视图
最后一点注意:查看页面功能正常,我可以很好地在正确的布局之间滑动。当我尝试使用所需的值更新视图时,会出现问题。我假设问题与我如何膨胀布局有关,或者与我如何多次膨胀布局有关。第三个问题让我很困惑。我找不到第一页/第二页和第三页/第四页之间的任何差异,但它们的行为显然不同。此外,所示的第一个代码块表示为活动
,第二个代码块I切换为片段活动
编辑以添加片段PageRadapter
public class MoreParmsFragmentPagerAdapter extends FragmentPagerAdapter {
final int PAGE_COUNT = 4;
public MoreParmsFragmentPagerAdapter( FragmentManager fm ) {
super(fm);
}
public Fragment getItem( int arg0 ) {
if( arg0 == 0 ) {
xmlOneFragment xml1Frag = new xmlOneFragment();
Bundle data = new Bundle();
data.putInt( "current_page", arg0 );
xmlOneFrag.setArguments( data );
return xmlOneFrag;
} else if( arg0 == 1 ) {
xmlTwoFragment xml2Frag = new xmlTwoFragment();
Bundle data = new Bundle();
data.putInt( "current_page", arg0 );
xmlTwoFrag.setArguments( data );
return xmlTwoFrag;
} else if( arg0 == 2 ) {
xmlThreeFragment xml3Frag = new xmlThreeFragment();
Bundle data = new Bundle();
data.putInt( "current_page", arg0 );
xmlThreeFrag.setArguments( data );
return xmlThreeFrag;
} else {
xmlFourFragment xml4Frag = new xmlFourFragment();
Bundle data = new Bundle();
data.putInt( "current_page", arg0 );
xmlFourFrag.setArguments( data );
return xmlFourFrag;
}
}
@Override
public CharSequence getPageTitle(int position) {
if( position == 0 ) {
return "xml1";
} else if( position == 1 ){
return "xml2";
} else if( position == 2 ) {
return "xml3";
} else {
return "xml4";
}
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return PAGE_COUNT;
}
}
编辑2:
private ViewPager mViewPager;
private MoreParmsFragmentPagerAdapter pagerAdapter;
private FragmentManager fm;
private AntiPumpFragment apFrag;
private RelaxedCloseFragment relFrag;
private MiscParmsFragment miscFrag;
private DNP3Fragment dnpFrag;
public void onCreate( Bundle savedInstanceState ) {
super.onCreate( savedInstanceState );
mViewPager = (ViewPager) findViewById( R.id.pager );
fm = getSupportFragmentManager();
pagerAdapter = new MoreParmsFragmentPagerAdapter(fm);
mViewPager.setAdapter( pagerAdapter );
apFrag = (AntiPumpFragment) fm.findFragmentByTag( "android:switcher:" + R.id.pager + ":0" );
relFrag = (RelaxedCloseFragment) fm.findFragmentByTag( "android:switcher:" + R.id.pager + ":1" );
miscFrag = (MiscParmsFragment) fm.findFragmentByTag( "android:switcher:" + R.id.pager + ":2" );
dnpFrag = (DNP3Fragment) fm.findFragmentByTag( "android:switcher:" + R.id.pager + ":3" );
在我的代码中,所有这些片段都返回null。ViewPager
在我的屏幕上正确显示,我可以在所有四个视图之间清晰地滑动。但是,我所有的if(apFrag!=null)
语句都会被跳过
第一个问题是,微调器从来没有填满它们的
对应的数组。在我的整个房间里都有LogCat呼叫
populateSpinners()方法,该方法显示我所期望的内容,但微调器
它们本身没有人口
正如您后来发现的,您没有看到微调器初始化,因为您没有连接到来自ViewPager
的Fragments
的视图,而只是使用LayoutInflater
从Fragments
中使用的布局文件中膨胀新视图。初始化此新视图的子视图将不会显示任何可视结果,因为它不存在/显示在活动的UI中,它“浮动”在等待您将其附加到活动中的视图组中,以便它可以显示它拥有的视图
第二个问题出现在updateUI()方法中。下面是评论
所有findViewById()调用都是我进行某些计算的地方
确定要在文本视图中放置的文本,以及要设置的索引
微调器,以及是否选中复选框。我有LogCat
显示找到的值的调用,它们都是预期值。
当.setText()、.setSelection()和.setChecked()方法
调用时,不会显示任何错误,但不会设置任何项。
一切都是空白的
这与一点相同,您不初始化显示的视图,而是更新未附加的视图
层次结构
第三个问题是什么让我最困惑。现在是文本视图
它们都有唯一的ID。当我第一次尝试实现此ViewPage时
private ViewPager mViewPager;
private MoreParmsFragmentPagerAdapter pagerAdapter;
private FragmentManager fm;
private AntiPumpFragment apFrag;
private RelaxedCloseFragment relFrag;
private MiscParmsFragment miscFrag;
private DNP3Fragment dnpFrag;
public void onCreate( Bundle savedInstanceState ) {
super.onCreate( savedInstanceState );
mViewPager = (ViewPager) findViewById( R.id.pager );
fm = getSupportFragmentManager();
pagerAdapter = new MoreParmsFragmentPagerAdapter(fm);
mViewPager.setAdapter( pagerAdapter );
apFrag = (AntiPumpFragment) fm.findFragmentByTag( "android:switcher:" + R.id.pager + ":0" );
relFrag = (RelaxedCloseFragment) fm.findFragmentByTag( "android:switcher:" + R.id.pager + ":1" );
miscFrag = (MiscParmsFragment) fm.findFragmentByTag( "android:switcher:" + R.id.pager + ":2" );
dnpFrag = (DNP3Fragment) fm.findFragmentByTag( "android:switcher:" + R.id.pager + ":3" );
xmlOneFragment first = (xmlOneFragment)getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.pager + ":0");
// if the fragment is found and its view is available do stuff
if (first != null && first.getView() != null) {
// do stuff
}