Сменить кнопку видимости с заголовка программы программно? - PullRequest
0 голосов
/ 14 декабря 2011

У меня проблема с видимостью кнопки. У меня есть 2 кнопки из заголовка. Один из них отредактирован, один из них готов. Сначала я хочу увидеть только кнопку редактирования, и когда я нажал кнопку редактирования, видимость кнопки редактирования будет ложной, а видимость кнопки "Готово" - true.

Я получаю их идентификатор из xml, и когда я нажимаю один из них, я хочу изменить видимость, но edit.setVisibility (); это не работает. Что не так? Я вижу кнопку редактирования. Я хочу изменить видимость программы программно.

У кого-нибудь может быть идея?

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    final boolean customTitle = requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);

    setContentView(R.layout.main);

    edit=(Button)findViewById(R.id.edit);
    done=(Button)findViewById(R.id.done);

    edit.setVisibility(View.INVISIBLE);
    getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE,R.layout.main);

    if ( customTitle ) {
       getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE,R.layout.main);
    }

main.xml:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="fill_parent"
       android:layout_height="fill_parent">

   <Button android:id="@+id/edit"
          android:layout_width="57px"
          android:layout_height="wrap_content"
          android:text="edit"/>

   <Button android:id="@+id/done"
          android:layout_width="57px"
          android:layout_height="wrap_content"
          android:text="done"/>

</LinearLayout>

Ответы [ 2 ]

0 голосов
/ 14 декабря 2011

Проблема в том, что setFeatureInt просто устанавливает идентификатор ресурса для заголовка, что приведет к новой инфляции ресурса макета, которая будет размещена в системе FrameLayout с именем id/title_container. Это можно проверить с помощью средства просмотра иерархии в Eclipse.

По сути, вы получаете два экземпляра основного макета. Один устанавливается в качестве представления содержимого (под заголовком), а другой - в качестве заголовка. Когда вы звоните findViewById, он будет искать в представлении содержимого только те представления, которые соответствуют идентификатору. Это означает, что кнопки edit и done, которые вы извлекаете, являются теми, которые находятся в представлении содержимого.

Если вы хотите получить доступ к кнопкам в области заголовка, вы можете использовать

    View v = getWindow().getDecorView();
    edit=(Button)v.findViewById(R.id.edit);
    done=(Button)v.findViewById(R.id.done);
    edit.setVisibility(View.INVISIBLE);

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

0 голосов
/ 14 декабря 2011

Во-первых, вам не хватает параметра android: direction в вашем LinearLayout.

Во-вторых, если вы хотите переключиться между редактированием и завершением, вы можете сделать это:

edit.setVisibility(View.GONE);
done.setVisibiluty(View.VISIBLE);

и наоборот, чтобы изменить кнопку редактирования снова .. С View.INVISIBLE кнопка не будет отображаться, но все еще будет использовать место, где она была.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...