Что эквивалентно трансляции событий ActionScript 3 в Android? - PullRequest
2 голосов
/ 12 февраля 2011

У меня есть пользовательская строка заголовка в приложении для Android, в которой на данный момент есть просто TextView. Мне интересно, какой лучший класс / метод использовать для обновления заголовка из любого вида деятельности? Например, у меня есть TabActivity с этой строкой заголовка, и мне нужно изменить заголовок при изменении одного из действий вкладок. Я также хотел бы изменить строку заголовка в других действиях, которые не находятся в контексте вкладки.

Я смотрел на BroadcastReceivers и Intents, но я не совсем понимаю номенклатуру, поэтому я не уверен, что эквивалентно чему-то вроде Event вещания Actionscript. Мне бы хотелось, чтобы мой класс строки заголовка прослушивал «глобальное» событие приложения, которое получает String, и обновлял заголовок при получении этого события. Как бы я это сделал?

В другом примере в iOS я бы использовал NSNotificationCenter и postNotification для запуска «события». Тогда я бы взял контроллер вида addObserver, прослушал бы это событие и ответил бы на него. Как что-то подобное достигается в рамках Android?

Например, у меня есть "основное" занятие:

<?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">

    <!-- here's my header-->
    <include layout="@layout/header"/>


    <TabHost
        android:id="@android:id/tabhost"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <LinearLayout
            android:orientation="vertical"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">
            <FrameLayout
                android:id="@android:id/tabcontent"
                android:layout_width="fill_parent"
                android:layout_height="0dip"
                android:layout_weight="1"/>
            <TabWidget
                style="@style/TabWidget"
                android:id="@android:id/tabs"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"/>
        </LinearLayout>
    </TabHost>

И заголовок включает текстовое поле, которое я хочу изменить:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    style="@style/Header">
    <TextView
        style="@style/HeaderTitle"
        android:text="@string/app_name"/>
</LinearLayout>

Итак, в основном я ищу способ передачи уведомлений в заголовок от любого из действий в TabHost или других действий, в которые включен заголовок.

1 Ответ

2 голосов
/ 12 февраля 2011

Я не решаюсь назвать это авторитетным ответом, так как сам все еще изучаю разработку под Android. Следовательно, это открытое сообщество вики. Надеюсь, некоторые из этих ответов приведут вас туда, куда вы хотите.

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

Button newButton = (Button) this.findViewById(R.id.headerbutton);
newButton.setText("click me");
newButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            globalHeader.setText("GOOOOGGGG");

        }
    });

OnClickListener - это интерфейс, реализованный View, который имеет функцию обратного вызова onClick, которая является общедоступной, чтобы внутренние функции newButton могли вызывать его, когда он обнаруживает, что на него щелкнули. Объекты должны передавать себя как слушатели, в отличие от ActionScript, где функции являются первыми членами класса. Это общие основы отношений слушателя и диспетчера событий Java. Где я взял переменную globalHeader? Как это:

final TextView globalHeader = (TextView) this.findViewById(R.id.TextView_GlobalHeader);     // TextView_GlobalHeader is just the id I assigned 
//to the header TextView that's used in the import statement.

Обратите внимание, что он объявлен окончательным. Это потому, что вы не можете передать его обработчику событий, если переменная, содержащая TextView, не является окончательной.

Так что я еще не нашел глобального концентратора типа EventDispatch в Android SDK. Я задавался вопросом, существует ли такая вещь сам, и если это не так, то это, чтобы предотвратить утечки памяти? Или, может быть, это потому, что Java настолько строг, что вы можете предположить, что любой слушатель сможет это сделать? Я думаю, что лучшее, что вы могли бы сделать в этом случае, это просто написать очень общий интерфейс OnGlobalEvent, например, с функцией responseToMessage (String pMessage), а затем заставить глобальный диспетчерский центр выполнять итерацию через всех своих слушателей, вызывая responseToMessage ( messsageType);

Но здесь мы надеемся, что кто-то, кто действительно знает, о чем он или она говорит, придет и покажет мне неправильно.

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