Как я могу получить доступ к представлениям в действиях в 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();
            }
        });
    }
}

Рез / макет /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);
    }
}

Рез / макет /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 ответа

Решение

Ваша проблема исходит из этих двух строк в MyTabActivity...

setContentView(R.layout.my_tab_activity);

...а также...

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

... хотя вы, очевидно, знаете findViewById(R.id.text_field) это то, что вызывает это.

С помощью findViewById(...) работает только при попытке доступа к элементам пользовательского интерфейса, которые были раздуты как часть вашей текущей деятельности. Как нет TextView с идентификатором ресурса R.id.text_field в my_tab_activity.xmlникогда не сработает.

Доступ к действиям, которые являются содержимым вкладки из TabHost / TabActivity это сложно. Мое предложение будет использовать SharedPreferences который может быть доступен из любого места в вашем приложении. Когда TextView (или любой другой элемент пользовательского ввода), сохраните его в SharedPreferences используя "ключ", который идентифицирует, с какой активности / вкладки он пришел. С тех пор, TabActivity можно легко сопоставить данные.

Вы можете получить ссылку на действия, выполняемые внутри действия вкладки, используя getLocalActivityManager() или getCurrentActivity (). Для возвращаемого объекта активности вы можете выполнить activity.findViewById(), чтобы получить ссылку на представление внутри определенного действия. Но стоит отметить, что TabActivity устарела, и вы должны использовать фрагменты, чтобы делать то, что вы ищете. Если вы ориентируетесь на версию Android более ранней, чем 3.0, вы можете использовать библиотеку совместимости для доступа к фрагментам.

Другие вопросы по тегам