【问题标题】:How can I access views in activities within a TabActivity?如何访问 TabActivity 中活动的视图?
【发布时间】:2011-11-25 03:18:38
【问题描述】:

我有一个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();
            }
        });
    }
}

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>

【问题讨论】:

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


    【解决方案1】:

    您的问题来自MyTabActivity...中的这两行...

    setContentView(R.layout.my_tab_activity);
    

    ...和...

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

    ...虽然你显然知道 findViewById(R.id.text_field) 是造成它的原因。

    使用findViewById(...) 仅在尝试访问已作为当前活动的一部分膨胀的 UI 元素时有效。由于my_tab_activity.xml 中没有资源ID 为R.id.text_fieldTextView,因此它永远不会工作。

    TabHost / TabActivity 访问作为选项卡内容的活动很棘手。我的建议是使用SharedPreferences,它可以从您应用程序的任何地方访问。一旦TextView(或任何其他用户输入项)发生更改,请使用标识它来自哪个活动/选项卡的“键”将其保存到SharedPreferences。从此TabActivity可以轻松整理数据。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-30
        • 1970-01-01
        相关资源
        最近更新 更多