6

タブベースのナビゲーションを持つ Android 3 アプリを作成中です。Android にまったく慣れていないので、タブ チュートリアルを検索したところ、いくつかの異なるアプローチが見つかりました。その中で、Fragments + ActionBar に基づく実装が最適であると思われました。これらのチュートリアルに従いました

http://www.abelski.com/courses/android3ui/actionbar.pdf (最後の数枚のスライド) および http://www.youtube.com/watch?v=gMu8XhxUBl8 (ビデオ形式の同じレッスン)

...そして、タブが表示されるようになりました。タブを切り替えることができ、タブ内の単純な TextView が正常に表示されます。

ここで、タブの 1 つに、フラグメントの XML ファイルで定義されたスピナー ウィジェットを持たせ、strings.xml ファイルで定義された項目を設定したい場合に問題が発生します。onCreate()メソッドからgetViewById()を使用してスピナーにアクセスしようとすると、結果として常に null 値が返されます。

私が理解しているように、これを修正するには、getViewById ( )がスピナー (Eclipse のただし、オートコンプリートはすでにそれを見つけています)。ただし、コード内の XML ベースのフラグメントのコンテンツを変更するシナリオに取り組んでいるチュートリアルがなかったため、これを行う方法が完全にわかりません。

main.xml は次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">


<LinearLayout android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:id="@+id/fragment_placeholder"></LinearLayout>

</LinearLayout>

次のような tab1_fragment.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical" 
              android:layout_width="fill_parent" 
              android:layout_height="fill_parent">

    <Spinner android:id="@+id/spinner1" 
             android:layout_width="wrap_content" 
             android:layout_height="wrap_content"/>
</LinearLayout>

および onCreate メソッドは次のようになります。

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    ActionBar ab = getActionBar();
    ab.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    ActionBar.Tab newAuditTab = ab.newTab().setText(R.string.tabheader_new_audit);
    Fragment newAuditFrag = new FragmentTabNewAudit();
    newAuditTab.setTabListener(new TabListener(newAuditFrag));
    ab.addTab(newAuditTab);

    //and the same for other tabs

    Spinner spinner = (Spinner) findViewById(R.id.spinner1); // this returns null
    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
            this, R.array.cell_array, android.R.layout.simple_spinner_item); //cell_array is defined in strings.xml


    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner.setAdapter(adapter);
    spinner.setOnItemSelectedListener(new MyOnItemSelectedListener());  
}

R.id を介して main.xml で定義されたビューにアクセスすることは正常に機能するため、この場合の問題は Eclipse の R クラスの自動インポートとは関係がないと思います。

この問題を回避するためにスピナーをプログラムで定義できると思いますが、おそらくもっと洗練された解決策があると思います。Android の全体像をまだ十分に把握できていないため、どこを見ればよいかわかりません。

4

1 に答える 1

8

スピナーはActivityそれ自体の子でfindViewByIdはないため、見つけることができません。スピナーはフラグメントの子であるため、次のことを試してみてください。

Spinner spinner = (Spinner)newAuditFrag.getView().findViewById(R.id.spinner1);

ただし、フラグメントのビューがいつ作成されるかはわかりません。そのためgetView()、コード内でそのポイントがnullを返す可能性もあります。次に、コードをに移動してみてください。onResumeこれは、の後に呼び出されonCreateます。

于 2011-09-29T13:53:35.077 に答える