如何在TabActivity中的活动中访问视图?

时间:2011-11-25 03:18:39

标签: android android-layout android-tabhost android-tabactivity

我有一个TabActivity包含其他旨在拆分表单的活动。 TabActivity在其布局中有一个按钮,用于从TabActivity中包含的所有活动中收集所有与表单相关的视图中的数据并存储它。我遇到的问题是TabActivity似乎无法访问这些视图;当我用其中一个来电话findViewById()时,我会得到NullPointerException

关于控制其包含的活动的TabActivity究竟如何工作的文档似乎很少。如果它在从一个活动切换到另一个活动时销毁一个活动,我所处的情况就有意义了。我想知道实现上述目标的最佳方法。

的src / COM /供应商/ 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 /布局/ 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 /供应商/ NestedActivity.java:

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

RES /布局/ 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>

2 个答案:

答案 0 :(得分: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中没有R.id.text_field的资源ID为my_tab_activity.xml,因此它永远不会起作用。

访问来自TabHost / TabActivity的标签内容的活动非常棘手。我的建议是使用SharedPreferences,您可以从应用中的任何位置访问该TextView。更改SharedPreferences(或任何其他用户输入项)后,使用“密钥”将其保存到TabActivity,该密钥标识来自哪个活动/标签。从那时起,{{1}}可以轻松整理数据。

答案 1 :(得分:1)

您可以使用getLocalActivityManager()getCurrentActivity()获取对标签活动内部运行的活动的引用。对于您返回的活动对象,您可以执行activity.findViewById()以获取对特定活动内部视图的引用。但是要指出TabActivity已被弃用,你应该使用Fragments来做你想要的事情。如果您的目标是早于3.0的Android版本,则可以使用compatibility library访问片段。