1

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

资源/布局/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);
    }
}

资源/布局/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

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 回答