Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 一旦Fragment和ViewPager实现,就无法编辑某些视图_Android_Android Fragments_Android Viewpager_Layout Inflater - Fatal编程技术网

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   
}