2013-11-14 9 views
12

私はAndroidアプリケーションを開発しています。私はコードで1つのビューを追加できるようにしたい、それはアプリケーション上のすべてのアクティビティの上に描画されます。すべてのアクティビティの上にビューを追加する

私はウィンドウマネージャに追加しようとしました:

LayoutInflater inflater = activity.getLayoutInflater(); 
layout = inflater.inflate(R.layout.toast_layout, null); 

WindowManager.LayoutParams params = new WindowManager.LayoutParams(); 
params.gravity = Gravity.BOTTOM; 
params.height = WindowManager.LayoutParams.WRAP_CONTENT; 
params.width = WindowManager.LayoutParams.WRAP_CONTENT; 
params.type = WindowManager.LayoutParams.TYPE_TOAST; 
final WindowManager mWindowManager = (WindowManager); 
activity.getApplicationContext().getSystemService(Context.WINDOW_SERVICE); 
       mWindowManager.addView(layout, params); 

しかし、このようにそれを追加し、私は二つの問題に直面している:私は私のアプリを終了すると

1.レイアウトがまだ表示されています。

2.レイアウトはクリックイベントに応答しません。

これを達成するための別の解決策がありますか?

ありがとうございました。

+0

を使用すると、各アクティビティで、この上面図をしたいですか? –

+0

@BirajZalavadia私のアプリからのすべての活動に。新しい活動を表示しても、私はまだ表示したいです – Mateu

答えて

3

。 アプリケーションを終了するときにビューが非表示になるように、onStopイベントとonResumeイベントをアタッチしました。

クリックイベントの場合、タイプトーストがクリックイベントに反応しないことに気付きました。したがって、私はあまりにも、次のpermisionを追加しました

params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; 

にタイプ

params.type = WindowManager.LayoutParams.TYPE_TOAST; 

を変更しました:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> 
+0

私はTYPE_SYSTEM_ALERTがユーザ権限を必要とすると思います。 –

+0

@GopalRaoはい、ソリューションに追加しました。申し訳ありませんが、TYPE_APPLICATIONはWINDOW_SERVICEビュー内で使用できません。 – Mateu

+0

@Mateuのクリックはまだ私のために働いていない、すべての3つのフラグを試してみました。 以下はビューのコードです: LinearLayout linearLayout = new LinearLayout(MainActivity.this); linearLayout.setBackgroundColor(getResources()。getColor(android.R.color.holo_red_light)); TextView valueTV =新しいTextView(これ); valueTV.setText( "hallo hallo");valueTV.setLayoutParams(新しいLayoutParams(LayoutParams.WRAP_CONTENT、LayoutParams.WRAP_CONTENT)); linearLayout.addView(valueTV); –

7

TYPE_TOASTからTYPE_APPLICATIONに変更LayoutParamsタイプ、そして私が示唆した以前のフラグを削除し、

onResume()でその活動に、あなたのアプリケーション内のすべての活動の1 BaseActivityを作成するには、WindowManagerにしてonPause()でこのビューを追加、削除そのビューのように、

windowManager.removeView(view); 
+0

これは問題(1)を解決しますが、(2)を解決しません。追加されたレイアウトはまだクリックイベントに応答していません。 – Mateu

+0

私の答えを編集しました。 pls check –

+0

TYPE_APPLICATIONで@ goap-raoを取得しました。次のandroid.view.WindowManagerを取得しました。$ BadTokenException:ウィンドウを追加できませんでした - アプリケーションでトークンnullが見つかりません。 – Mateu

6

1)アクティビティを拡張するBaseActivityを作成します。

2)今、あなたのすべての活動はすべきではsetContentView()メソッドをオーバーライドします)活動

代わり

3をBaseActivityを拡張します。

4)このメソッドでは、blank vertical verticalLayoutを作成します。

5)

はこれを実装する方法)super.setContentView(passLinearLayoutHereをこのレイアウト

6)であなたの上面図を追加し、こののLinearLayout

7)で膨張したビューを追加し、最終的に呼び出します?私はゴパルによって提案されたソリューションを使用したビューの表示/ビューを管理するために

import android.app.Activity; 
import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.LinearLayout; 

public class BaseActivity extends Activity { 

    @Override 
    public void setContentView(int resId) { 

     LinearLayout screenRootView = new LinearLayout(this); 
     screenRootView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 
       LinearLayout.LayoutParams.MATCH_PARENT)); 
     screenRootView.setOrientation(LinearLayout.VERTICAL); 

     // Create your top view here 
     View topView = new View(this); // Replace this topview with your view 

     LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     View screenView = inflater.inflate(resId, null); 
     topView.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
          //You will get onclick here of your topview in whatever screen it is clicked 
      } 
     }); 

     screenRootView.addView(topView); 
     screenRootView.addView(screenView); 

     super.setContentView(screenRootView); 
    } 

} 
+0

これは、ユーザーがアクティビティを切り替えるたびに新しいビューを作成し、既存のトップビューを再利用しません。 –

+0

複数の親を持つことのできないoopsの概念に違反しているため、同じビューオブジェクトをアクティビティ間で使用することはできません。ビューがアクティビティーにアタッチされると、そのアクティビティーの子であるため、他のアクティビティーは同じビューを使用できません。これは、この種の機能を実装するための適切な方法です。 –

+0

そうですね、これは質問に答えることができないことを指摘したかったのですが、それはほとんどあなたを救う回避策です。 –

関連する問題