編集:
さらに詳しく調べてみると、問題は、FragmentActivity
onCreate()メソッドでレイアウトを拡張すると、ViewPager内でさまざまなビューが拡張されることであるとほぼ確信しています。xml1.findViewById()
だから私が別のビューを見ていることを使用してそれらにアクセスしようとすると。で使用されているビューにアクセスするにはどうすればよいViewPager
ですか?私FragmentPagerAdapter
を見ると、フラグメントは1回以上スワイプするたびに新しいオブジェクトとして作成されているように見えます。4つのビューすべてを一度に初期化する必要があります。その後、電話をかけるたびにupdateUI
、4つのビューが一度に変更されます。したがって、新しく更新された4つのビューすべての間をスワイプできます。
を使用してみpagerAdapter.getItem(index).getView().findViewById( )
ましたが、が返されますNullPointerException
。例外が発生した後、クラスのgetView()
メソッドをオーバーライドしてみました。Fragment
私がメソッドに入れたのはreturn view;
、ビューがメソッドで返されたビューの保存されたインスタンスであるということだけでしたonCreateView
。これにより、ViewPagerに4つの空白の画面が表示されて間をスワイプできました。
FragmentPagerAdapter
質問の最後に実装を追加しました。
編集終了
ViewPager
を使用して実装してみましたFragments
。非常に奇妙な結果が出ています。
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.
}
}
これは私のFragment
クラスの例です:
public class xmlOneFragment extends Fragment {
int mCurrentPage;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/** Getting the arguments to the Bundle object */
Bundle data = getArguments();
/** Getting integer data of the key current_page from the bundle */
mCurrentPage = data.getInt("current_page", 0);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.xml1, container,false);
return v;
}
}
最初の問題は、Spinners
が対応する配列で満たされることがないことです。私のメソッド全体に、私が期待するものを示すLogCat
呼び出しがありますが、それ自体は入力されていません。populateSpinners()
Spinners
2番目の問題はupdateUI()
メソッドで発生します。すべての呼び出しの下のコメントは、findViewById()
特定の計算を行って、に入れるテキスト、TextViews
設定するインデックスSpinners
、およびをチェックするかどうかを決定する場所CheckBoxes
です。見つかった値をLogCat
示す呼び出しがありますが、それらはすべて期待されるものです。メソッドが呼び出されたとき、.setText(), .setSelection(), and .setChecked()
エラーは表示されませんが、どの項目もまったく設定されていません。すべてが空白のままです。
3番目の問題は私を最も混乱させているものです。現在TextViews
、すべてが一意のIDを持っています。これを最初に実装しようとしたとき、呼び出しのプレフィックスなしViewPager
でupdateUI()
メソッドにTextViewsを処理させました。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 );
このメソッドの結果は、でしたが、3番目と4番目のページでを呼び出したNullPointerException
場合のみです。最初の2ページは例外をスローしませんでした。そこで、3ページ目と4ページ目をコメントアウトしました。プログラムが実行され、最初の2ページに正しいTextViewに正しい値が表示されました。次に、メソッドに追加しようとしましたが、例外はスローされませんが、ビューはまったく更新されません。.setText()
TextViews
xml*.
findViewById()
最後の注意:ViewPager
機能は正しく、適切なレイアウト間を非常にうまくスワイプできます。ビューを必要な値で更新しようとすると、問題が発生します。問題は、レイアウトをどのように膨らませているか、または何度もそれを行う方法に関係していると思います。3番目の問題は本当に私を困惑させます。1ページ目/2ページ目と3ページ目/4ページ目で違いはわかりませんが、明らかに動作が異なります。また、示されている最初のコードブロックは、として表されActivity
、2番目のコードブロックはに切り替えましたFragmentActivity
。
編集してFragmentPagerAdapterを追加します
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
画面に正しく表示され、4つのビューすべてをきれいにスワイプできます。ただし、私のif( apFrag != null )
ステートメントはすべてスキップされます。