#android #xml #layout #drawable #android-tabhost
#Android #xml #макет #объект рисования #android-tabhost
Вопрос:
У меня есть пользовательский TabHost, который добавляет вкладки, подобные этой
private void setTab(View view, String tag, Intent intent)
{
View tabView = LayoutInflater.from(context).inflate(R.layout.tabs_bg, null);
TextView tv = (TextView) view.findViewById(R.id.tabsText);
tv.setText(tag);
TabSpec setContent = mTabHost.newTabSpec(tag).setIndicator(tabView)
.setContent(intent);
mTabHost.addTab(setContent);
}
где mTabHost — это узел вкладки, а tabs_bg.xml просто имеет textview в linearlayout. (Мой основной макет такой же, как в примере с макетом вкладки; я просто пытаюсь использовать небольшие вкладки, содержащие только текст.) Моя вкладка info вызывается следующим образом:
intent = new Intent().setClass(this, AboutScreen.class);
setTab(new TextView(this), "about", intent);
AboutScreen расширяет Activity, и все, что он делает, это устанавливает contentView на это
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout android:orientation="horizontal"
android:layout_width="fill_parent" android:layout_height="wrap_content">
<TextView android:id="@ id/AboutUsTitle"
android:textColor="#ffffffff" android:text="@string/about_title"
android:layout_height="wrap_content" android:layout_width="fill_parent"
android:layout_gravity="center" android:gravity="center"
android:background="@drawable/about_title"/>
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="15dip">
<TextView android:id="@ id/AboutContents"
android:text="@string/about_contents" android:layout_height="wrap_content"
android:layout_width="wrap_content"/>
</LinearLayout>
</LinearLayout>
где @drawable / about_title это:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:startColor="#ffffffff"
android:endColor="#ff333333"
android:angle="90"/>
</shape>
Этот объект рисования не отображается внутри FrameLayout. Все остальное отображается правильно. Есть идеи, что я делаю не так?
РЕДАКТИРОВАТЬ: если я установлю это программно
TextView tvAboutUsTitle = (TextView) findViewById(R.id.AboutUsTitle);
tvAboutUsTitle.setBackgroundResource(R.drawable.about_title);
оно отображается. Чем это отличается от настройки в xml?
Комментарии:
1. Единственное, что я вижу, что отличается, это название вашего объекта рисования — ‘about_title’ против ‘gradient’. Они одинаковые для рисования?
2. Упс! Да, это моя вина, что я скопировал материал в новые файлы во время тестирования, помогло ли использование ссылок @color. Я отредактирую оригинал, чтобы исправить это.
Ответ №1:
я нигде не вижу, чтобы вы использовали tv (TextView), если только его просто не хватает в этом фрагменте кода?
Вот пример того, как я настраиваю 3 вкладки в упражнении, которое может вам помочь
РЕДАКТИРОВАТЬ: Я забыл упомянуть. В этом коде мне также понадобилось то, что, я думаю, вам нужно, пользовательская вкладка в одну строку.
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
context = this.getApplicationContext();
application = ((rbApplication)getApplicationContext());
setContentView(R.layout.channellist);
new DownloadTask().execute();
setupTabs();
}
public void setupTabs() {
TabHost tabHost = getTabHost(); // The activity TabHost
tabHost.getTabWidget().setDividerDrawable(R.drawable.tab_divider);
TabHost.TabSpec spec; // Reusable TabSpec for each tab
Intent intent; // Reusable Intent for each tab
// Initialize a TabSpec for each tab and add it to the TabHost
intent = new Intent().setClass(application, ChannelListSubscribed.class);
spec = tabHost.newTabSpec("subscribed");
View customTabView1 = createTabView(application, "Subscribed");
spec.setIndicator(customTabView1);
spec.setContent(intent);
tabHost.addTab(spec);
intent = new Intent().setClass(application, ChannelListNonSubscribed.class);
spec = tabHost.newTabSpec("nonsubscribed");
View customTabView2 = createTabView(application, "Find More");
spec.setIndicator(customTabView2);
spec.setContent(intent);
tabHost.addTab(spec);
intent = new Intent().setClass(application,ChannelListFeatured.class);
spec = tabHost.newTabSpec("featured");
View customTabView3 = createTabView(application, "Featured");
spec.setIndicator(customTabView3);
spec.setContent(intent);
tabHost.addTab(spec);
tabHost.setCurrentTab(0);
}
private static View createTabView(final Context context, final String tabLabel) {
View view = LayoutInflater.from(context).inflate(R.layout.tab_item, null);
TextView tv = (TextView) view.findViewById(R.id.tab_label);
tv.setText(tabLabel);
return view;
}
tab_item.xml
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:padding="10dip"
android:gravity="center"
android:orientation="vertical"
android:background="@drawable/tab_bg_selector">
<TextView
android:id="@ id/tab_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16dp"
android:textColor="@drawable/tab_text_selector"/>
</LinearLayout>
Комментарии:
1. Я делаю
tv.setText(tag);
сразу после получения textview. Мой tabs_bg.xml выглядит так же, как ваш tab_item.xml (мой @ id / tabsText — это ваш @ id / tab_label.) Если я вызываю AboutScreen в качестве основного действия вместо макета вкладки, отображается градиент. Если я вызываю его внутри макета вкладки, это не так.
Ответ №2:
У меня были проблемы, когда представление отображалось недостаточно большим из-за того, что его размер, по-видимому, определялся до того, как стало известно его содержимое, хотя все это хранится в xml (со ссылками на строки)
Вы пробовали устанавливать layout_height и widths в числовые значения (или даже «заполнить родительский элемент», чтобы убедиться, что это так?
Кроме того, я бы упростил макет, чтобы удалить вложенные LinearLayouts? поскольку они кажутся ненужными из-за того, что каждый содержит только один TextView
Комментарии:
1. Я попытался изменить layout_height / widths на числовые значения, как dp, так и px, но это не имеет никакого значения — они отображаются, если вы смотрите на действие напрямую, но не при его загрузке на вкладку, если вы специально не настроили это программно. Также не имеет значения, делаю ли я это с посторонними LinearLayouts или без них (они есть только потому, что во всех моих действиях используется один и тот же базовый макет, а на других экранах есть нечто большее, чем просто textview, поэтому их удаление здесь имеет смысл.)
Ответ №3:
Поскольку мы все равно сейчас не используем вкладку, я собираюсь закрыть это, поскольку это
TextView tvAboutUsTitle = (TextView) findViewById(R.id.AboutUsTitle);
tvAboutUsTitle.setBackgroundResource(R.drawable.about_title);
исправлена проблема, с которой я все равно сталкивался, даже если я действительно не знаю, почему.