1

TabActivityフォームを分割することを目的とした他のアクティビティが含まれています。のTabActivityレイアウトには、に含まれるすべてのアクティビティにわたるすべてのフォーム関連ビューからデータを収集して保存することを目的としたボタンがありますTabActivity。私が遭遇している問題は、TabActivityがこれらのビューにアクセスできないように見えることです。findViewById()そのうちの1つに電話をかけると、が表示されNullPointerExceptionます。

TabActivityドキュメントは、含まれているアクティビティの制御に関してどのように機能するかについてはまばらに見えます。アクティビティを別のアクティビティに切り替えるときにそれがアクティビティを破壊する場合、私がいる状況は理にかなっています。上記の目標を達成するための最善のアプローチを知りたいです。

src / com / vendor / MyTabActivity.java:

public class MyTabActivity extends TabActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_tab_activity);
        final Button saveButton = (Button) findViewById(R.id.save_button);
        saveButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                // NullPointerException happens here
                String fieldValue = ((TextView) findViewById(R.id.text_field)).getText().toString();
            }
        });
    }
}

res / layout / my_tab_activity.xml:

<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost">
    <LinearLayout>
        <TabWidget android:id="@android:id/tabs"/>
        <FrameLayout android:id="@android:id/tabcontent" />
        <Button android:id="@+id/save_button"/>
    </LinearLayout>
</TabHost>

src / com / vendor / NestedActivity.java:

public class NestedActivity extends Activity {  
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.nested_activity);
    }
}

res / layout / nested_activity.xml:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android">  
    <RelativeLayout>
        <EditText android:id="@+id/text_field"/>
    </RelativeLayout>
</ScrollView>
4

2 に答える 2

2

あなたの問題はこれらの2行から来ていMyTabActivityます...

setContentView(R.layout.my_tab_activity);

...と...

String fieldValue = ((TextView) findViewById(R.id.text_field)).getText().toString();

...あなたは明らかにfindViewById(R.id.text_field)それを引き起こしているものであることを知っていますが。

使用findViewById(...)は、現在のアクティビティの一部として拡張されたUI要素にアクセスしようとした場合にのみ機能します。にTextViewのリソースIDがないため、機能しません。R.id.text_fieldmy_tab_activity.xml

TabHost/からタブコンテンツであるアクティビティにアクセスするのTabActivityは注意が必要です。私の提案はSharedPreferences、アプリのどこからでもアクセスできるものを使用することです。TextView(または他のユーザー入力項目)が変更されたら、SharedPreferencesそれがどのアクティビティ/タブから来たかを識別する「キー」を使用して保存します。それ以降、TabActivityはデータを簡単に照合できます。

于 2011-11-25T03:43:22.240 に答える
1

getLocalActivityManager()またはgetCurrentActivity()を使用して、タブアクティビティ内で実行されているアクティビティへの参照を取得できます。戻ってきたアクティビティオブジェクトに対して、activity.findViewById()を実行して、特定のアクティビティ内のビューへの参照を取得できます。ただし、TabActivityは非推奨になっているため、Fragmentsを使用して探していることを実行する必要があります。3.0より前のバージョンのAndroidをターゲットにしている場合は、互換性ライブラリを使用してフラグメントにアクセスできます。

于 2011-11-25T03:31:50.363 に答える