2011-02-12 9 views
2

私はAndroidアプリケーションにカスタムのタイトルバーを持っていますが、その中には簡単なTextViewがあります。私はどのような活動からタイトルを更新するために使用するための最善のクラス/メソッドが何になるのだろうか?たとえば、このタイトルバーを持つTabActivityがあります。タブアクティビティのいずれかが変更されたときにタイトルを変更する必要があります。また、タブのコンテキストにない他のアクティビティでもタイトルバーを変更したいと考えています。AndroidのActionScript 3のイベントブロードキャストに相当するものは何ですか?

私はBroadcastReceiversIntents見てきたが、私は本当に命名法を理解していないので、私は、ActionScriptのEvent放送のようなものの同等が何であるかわかりません。私はタイトルバークラスが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内のアクティビティ、またはヘッダーが含まれている他のアクティビティからヘッダーに通知を渡す方法を探しています。

+0

"グローバル"アプリケーションイベントとは、イベントバブリングの行に沿って何かを参照していますか?ここでイベントはツリー構造を下から上に移動しますか? AS2 ASBroadcasterの行に沿って、文字列と同じ名前の関数をリスナーが持つ限り、文字列識別子はどこでも関数を呼び出すことができます。あるいは、おそらく両方の混合物。文字列は関数にマッピングされますが、関数の名前ではありませんか? – scriptocalypse

+0

またはのいずれか。私は、TitleBarがTabHostにロードされるアクティビティのレイアウトの一部ではないことを知っています。そのため、タイトルバーをどのようにターゲットするかはわかりません。 – typeoneerror

+0

getParent()を使用してメインアクティビティにアクセスできるように見えますが、そのようなアクティビティを結合したくありません。 – typeoneerror

答えて

2

私はまだAndroid開発を自分自身で学習しているので、これは正式な答えと呼ぶことを躊躇します。したがって、これはオープンコミュニティのWikiです。うまくいけば、これらの答えのいくつかはあなたが行きたいところを導くでしょう。

あなたは、このようないくつかのコードに気づいたかもしれないの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は公にので、公開されたコールバック関数のonClickを持って見ることでimplenetedインターフェースです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を含む変​​数がfinalでない限り、イベントハンドラに渡すことができないためです。

私はまだAndroidのSDKにグローバルEventDispatchタイプのハブが見つかりませんでした。私はそのようなものが自分自身に存在するかどうか疑問に思っていました。もしそうでなければ、メモリリークを避けるのですか?それとも、Javaが非常に厳格であるため、あるリスナーができると思う貴重なものがほとんどないからです。その場合にできることは、たとえばrespondToMessage(String pMessage)関数などの非常に汎用的なOnGlobalEventインターフェイスを作成してから、グローバルディスパッチハブをすべてのリスナーで繰り返し、respondToMessage( messsageType);

しかし、ここでは、実際に話していることを知っている誰かが一緒に来てくれて、間違っていると思っています。

関連する問題