findViewById в пользовательской строке заголовка в активности вкладок

У меня есть настраиваемая строка заголовка, установленная на моем TabActivity. Настраиваемая строка заголовка содержит TextView и ImageView. TabHost имеет несколько вкладок.

Что я хочу сделать, так это получить доступ к ресурсу ImageView на вкладках.

Я получаю доступ к TextView из пользовательской строки заголовка в основной активности вкладки (которая расширяет TabActivity), и она работает нормально. Ниже приведен код, который отлично работает в основной деятельности:

requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
setContentView(R.layout.myactivity);
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.mycustomtitle);
TextView tv = (TextView) findViewById(R.id.viewTitleId);

Теперь я хочу получить доступ к ImageView на своих вкладках (которые добавляются в tabHost). Если я установлю следующий код на вкладке:

requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);

Выдает следующую ошибку:

You cannot combine custom titles with other title features

И если я прямо установил следующее в коде вкладки:

getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.mycustomtitle);
ImageView image = (ImageView) findViewById(R.id.imageTitleId);

Изображение остается нулевым.

mycustomtitle.xml содержит следующие два элемента:

<TextView 
     android:layout_width="0dp"
     android:layout_height="wrap_content" 
     android:layout_weight="0.80"
     android:id="@+id/viewTitleId"
     android:textColor="@color/titleBarTextColor"
     android:gravity="center_vertical"
     android:text="@string/viewText"
     android:textSize="18px"
     android:paddingLeft="45px"
     />

<ImageView 
    android:layout_height="wrap_content" 
    android:layout_width="0dp" 
            android:layout_weight="0.20"
    android:src="@drawable/btn_save" 
    android:id="@+id/imageTitleId"
    >
</ImageView>

Пожалуйста, дайте мне некоторое представление, как я могу получить доступ к пользовательскому заголовку ImageView на вкладках?


person rizzz86    schedule 14.10.2011    source источник


Ответы (3)


Вы можете получить доступ к TextView и ImageView, объявив их public static в файле TabActivity. Затем в Sub-Activity вы, очевидно, получаете доступ к общедоступным статическим TextView и ImageView, например,

Main_Tab_Activity.textView.setText("my_text_view");
person Lalit Poptani    schedule 14.10.2011
comment
Это действительно плохой совет. Пожалуйста, прекратите создавать утечки памяти для пользователей SO. - person Reno; 21.02.2012
comment
если вы явно не обнуляете общедоступные статические поля, они навсегда сохранят ссылку на представления, даже если экземпляр TabActivity уже уничтожен. и, сохраняя ссылки на представления, вы фактически пропускаете всю активность. - person ct_rob; 21.09.2012
comment
@ct_rob как насчет добавления альтернативного решения в этом случае. Просто указать причину недостаточно. - person Lalit Poptani; 21.09.2012
comment
Для тех, у кого есть знания, но нет времени: - Я могу увидеть только три ответа: один от Венки, другой от Лалита, один от ДжайСони. Если будут другие ответы, я их тоже рассмотрю. - person MKJParekh; 21.09.2012
comment
@lalit Я все еще ищу ответ, я только что ответил на вопросы Эрикли, почему данный ответ может привести к утечке памяти. вы видите много ответов на SO, которые просто советуют людям использовать общедоступные статические ссылки, и это почти всегда очень плохое решение. - person ct_rob; 21.09.2012
comment
@ct_rob Я предлагаю сохранить экземпляр View в классе Application, возможно, это будет лучше. - person Lalit Poptani; 21.09.2012
comment
да, это немного лучше, так как вы, вероятно, будете перезаписывать это для каждого экрана, и, таким образом, у вас будет только одно представление в памяти в то время. Общедоступная статическая переменная, используемая таким образом, по-прежнему нарушает многие принципы объектно-ориентированного программирования. В моем случае я нашел простое решение. При добавлении пользовательского макета заголовка его содержимое также будет найдено с помощью findViewById в действии. Однако я не использую TabActivity, поэтому не знаю, применимо ли это и здесь. ваше здоровье - person ct_rob; 21.09.2012

Если вы поместите настраиваемую строку заголовка только в основную вкладку, эта строка заголовка появится во всех ваших дополнительных вкладках.

Например, если вы указали пользовательскую строку заголовка в Main TabActivity:

requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
setContentView(R.layout.main_layout);
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE,R.layout.header_layout);
TextView tv = (TextView) findViewById(R.id.viewTitleId);
ImageView image = (ImageView)findViewById(R.id.imageTitleId);

нет необходимости указывать все действия на подвкладках.

Во всех дополнительных вкладках вы просто устанавливаете setContentView(R.layout.sub_layout);

person Venky    schedule 14.10.2011
comment
Да, @Venky, мы можем получить доступ как к текстовому просмотру, так и к просмотру изображений в основной вкладке. Но я хочу получить доступ к ImageView в своих действиях на вложенной вкладке. Я хочу другое поведение ImageView на каждой вложенной вкладке. - person rizzz86; 14.10.2011
comment
@ rizzz86 Почему вам нужно использовать это изображение в подактивности? По умолчанию он будет отображаться во всех подоперациях, верно? - person Venky; 14.10.2011
comment
Да, он появляется во всех дополнительных действиях. Но мне нужно другое поведение на каждой вложенной вкладке, когда я нажимаю на ImageView. Например, при нажатии на ImageView с 1-й открывающей вкладкой значение будет сохранено в таблице 1, а при нажатии на ImageView со 2-й открывающей вкладкой значение будет сохранено в таблице 2 и т. д. - person rizzz86; 14.10.2011
comment
@rizzz86 Заходите в chat.stackoverflow.com/rooms/1531/casual-chat чат.. мы обсудят - person Venky; 14.10.2011
comment
Спасибо за вашу поддержку @Venky. Я получил ответ от Лалит Поптани - person rizzz86; 14.10.2011

использовать

getParent().getWindow().findViewById(id)

вставлен идентификатор findViewById(id); для доступа к любому представлению родителя.

person Jaiprakash Soni    schedule 07.09.2012