Характеристики сот и TabHost - PullRequest
4 голосов
/ 23 марта 2011

У меня вопрос по поводу обратной совместимости Honeycomb. У меня есть приложение, которое поддерживает 2.1 или выше и, кажется, в основном работает на Honeycomb, кроме случаев, когда они запускают TabActivity.

В частности, когда я добавляю вкладки в TabHost, я получаю следующее исключение

android.content.res.Resources $ NotFoundException: идентификатор ресурса # 0x0

Глядя на код, который выдает это исключение, я вижу, что это спецификация вкладки, которая имеет метку и значок. Внутри кода в LabelAndIconIndicatorStrategy пытается раздуть файл макета R.layout.tab_indicator, который, по-видимому, недоступен.

    TabHost.TabSpec spec; // Resusable TabSpec for each tab
    Intent intent; // Reusable Intent for each tab

    // Create an Intent to launch an Activity for the tab (to be reused)
    intent = new Intent().setClass(_gameActivity, ScoreGameActivity.class);
    intent.putExtra(GameChangerConstants.STREAM_ID, _stream.pk().toString());

    // Initialize a TabSpec for each tab and add it to the TabHost
    spec = _gameTabHost.newTabSpec("score_game").setIndicator("Score", res.getDrawable(R.drawable.icon_field_gloss)).setContent(intent);
    _gameTabHost.addTab(spec);

Есть ли новый способ создания вкладок для сот, о котором я не знаю? Я пролил документацию, но не увидел ничего, что указывало бы на проблему с тем, что я сделал.

Я бы хотел избегать использования фрагментов на этом этапе, пока мы не сможем выполнить более полную реструктуризацию наших виджетов пользовательского интерфейса, и я бы хотел лучше понять эту проблему.

1 Ответ

14 голосов
/ 24 мая 2011

Я считаю, что нашел решение, но, поскольку людям любопытно, вот трассировка стека, которую я получил, когда столкнулся с этой проблемой:

05-17 13:09:53.462: ERROR/CustomExceptionHandler(500): Uncaught throwable in thread Thread[main,5,main]
    android.content.res.Resources$NotFoundException: Resource ID #0x0
    at android.content.res.Resources.getValue(Resources.java:1014)
    at android.content.res.Resources.loadXmlResourceParser(Resources.java:2039)
    at android.content.res.Resources.getLayout(Resources.java:853)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:389)
    at android.widget.TabHost$LabelAndIconIndicatorStrategy.createIndicatorView(TabHost.java:568)
    at android.widget.TabHost.addTab(TabHost.java:226)
    at com.myApp.ui.TabDialog.addTab(TabDialog.java:80)
    ...

В этой строке у меня есть код, примерно эквивалентныйЧто за искра увидела:

spec = myTabHost.newTabSpec("score_game").setIndicator("Score", res.getDrawable(R.drawable.icon_field_gloss)).setContent(intent);
myTabHost.addTab(spec);

Обратите внимание, что myTabHost - это TabHost, а spec - это TabSpec.

Ранее я инициализировал myTabHost следующим образом:

//WRONG - This can CRASH your app starting at Android SDK 3.0
TabHost myTabHost = new TabHost(getContext()); 

Чтобы исправить эту проблему, я начал инициализировать TabHost следующим образом:

TabHost myTabHost = new TabHost(getContext(), null); 

И это исправило!Я хотел бы найти основную причину, но я еще не смог понять это.

...