2017-09-11 7 views
1

enter image description here表示レイアウトすべての活動訪問

こんにちは私の目標は、私は私のチャットアプリケーションのための を訪れたすべての活動にビデオを含むレイアウトを表示することですが、それは可能ですか?

はいの場合は、私にアプローチする方法をご案内してくださいありがとうございます。

は私がフラグメントを使用しますが、今のように我々のアプリのアプローチは活動の多くを使用している場合、それは可能である知っている

答えて

2

ステップ-1:AndroidManifest.xmlファイルにandroid.permission.SYSTEM_ALERT_WINDOW権限を追加します。この許可は、アプリが他のすべてのアプリの上に表示されるウィンドウを作成することを許可します。

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

ステップ2:表示したいチャットヘッドのレイアウトを作成します。

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="65dp" 
    android:id="@+id/chat_head_root" 
    android:layout_height="wrap_content" 
    android:orientation="vertical"> 

    <!--Profile image for the chat head.--> 
    <ImageView 
     android:id="@+id/chat_head_profile_iv" 
     android:layout_width="60dp" 
     android:layout_height="60dp" 
     android:layout_marginTop="8dp" 
     android:src="@drawable/ic_android_circle" 
     tools:ignore="ContentDescription"/> 

    <!--Close button--> 
    <ImageView 
     android:id="@+id/close_btn" 
     android:layout_width="26dp" 
     android:layout_height="26dp" 
     android:layout_marginLeft="40dp" 
     android:src="@drawable/ic_close" 
     tools:ignore="ContentDescription"/> 
</RelativeLayout> 

ここで、ChatHeadServiceというサービスを作成します。チャットヘッドを表示する場合は、startService()コマンドを使用してサービスを開始します。サービスのonCreate()では、ウィンドウの左上隅にチャットヘッドのレイアウトを追加します。

チャットヘッドをユーザーのタッチでドラッグするには、OnTouchListener()をオーバーライドしてonclickを実装してサービスを停止する必要があります。

import android.app.Service; 
import android.content.Intent; 
import android.graphics.PixelFormat; 
import android.os.IBinder; 
import android.view.Gravity; 
import android.view.LayoutInflater; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.WindowManager; 
import android.widget.ImageView; 

public class ChatHeadService extends Service { 

    private WindowManager mWindowManager; 
    private View mChatHeadView; 

    public ChatHeadService() { 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     //Inflate the chat head layout we created 
     mChatHeadView = LayoutInflater.from(this).inflate(R.layout.layout_chat_head, null); 

     //Add the view to the window. 
     final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
       WindowManager.LayoutParams.WRAP_CONTENT, 
       WindowManager.LayoutParams.WRAP_CONTENT, 
       WindowManager.LayoutParams.TYPE_PHONE, 
       WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, 
       PixelFormat.TRANSLUCENT); 

     //Specify the chat head position 
     params.gravity = Gravity.TOP | Gravity.LEFT;  //Initially view will be added to top-left corner 
     params.x = 0; 
     params.y = 100; 

     //Add the view to the window 
     mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE); 
     mWindowManager.addView(mChatHeadView, params); 

     //Set the close button. 
     ImageView closeButton = (ImageView) mChatHeadView.findViewById(R.id.close_btn); 
     closeButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       //close the service and remove the chat head from the window 
       stopSelf(); 
      } 
     }); 

     //Drag and move chat head using user's touch action. 
     final ImageView chatHeadImage = (ImageView) mChatHeadView.findViewById(R.id.chat_head_profile_iv); 
     chatHeadImage.setOnTouchListener(new View.OnTouchListener() { 
      private int lastAction; 
      private int initialX; 
      private int initialY; 
      private float initialTouchX; 
      private float initialTouchY; 

      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       switch (event.getAction()) { 
        case MotionEvent.ACTION_DOWN: 

         //remember the initial position. 
         initialX = params.x; 
         initialY = params.y; 

         //get the touch location 
         initialTouchX = event.getRawX(); 
         initialTouchY = event.getRawY(); 

         lastAction = event.getAction(); 
         return true; 
        case MotionEvent.ACTION_UP: 
         //As we implemented on touch listener with ACTION_MOVE, 
         //we have to check if the previous action was ACTION_DOWN 
         //to identify if the user clicked the view or not. 
         if (lastAction == MotionEvent.ACTION_DOWN) { 
          //Open the chat conversation click. 
          Intent intent = new Intent(ChatHeadService.this, ChatActivity.class); 
          intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
          startActivity(intent); 

          //close the service and remove the chat heads 
          stopSelf(); 
         } 
         lastAction = event.getAction(); 
         return true; 
        case MotionEvent.ACTION_MOVE: 
         //Calculate the X and Y coordinates of the view. 
         params.x = initialX + (int) (event.getRawX() - initialTouchX); 
         params.y = initialY + (int) (event.getRawY() - initialTouchY); 

         //Update the layout with new X & Y coordinate 
         mWindowManager.updateViewLayout(mChatHeadView, params); 
         lastAction = event.getAction(); 
         return true; 
       } 
       return false; 
      } 
     }); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     if (mChatHeadView != null) mWindowManager.removeView(mChatHeadView); 
    } 
} 

サンプルの活動

import android.content.Intent; 
import android.net.Uri; 
import android.os.Build; 
import android.os.Bundle; 
import android.provider.Settings; 
import android.support.v7.app.AppCompatActivity; 
import android.view.View; 
import android.widget.Toast; 

public class MainActivity extends AppCompatActivity { 
    private static final int CODE_DRAW_OVER_OTHER_APP_PERMISSION = 2084; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     //Check if the application has draw over other apps permission or not? 
     //This permission is by default available for API<23. But for API > 23 
     //you have to ask for the permission in runtime. 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(this)) { 

      //If the draw over permission is not available open the settings screen 
      //to grant the permission. 
      Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, 
        Uri.parse("package:" + getPackageName())); 
      startActivityForResult(intent, CODE_DRAW_OVER_OTHER_APP_PERMISSION); 
     } else { 
      initializeView(); 
     } 
    } 

    /** 
    * Set and initialize the view elements. 
    */ 
    private void initializeView() { 
     findViewById(R.id.notify_me).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       startService(new Intent(MainActivity.this, ChatHeadService.class)); 
       finish();// comment this if you want your activity not to close. 
      } 
     }); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == CODE_DRAW_OVER_OTHER_APP_PERMISSION) { 

      //Check if the permission is granted or not. 
      if (resultCode == RESULT_OK) { 
       initializeView(); 
      } else { //Permission is not available 
       Toast.makeText(this, 
         "Draw over other app permission not available. Closing the application", 
         Toast.LENGTH_SHORT).show(); 

       finish(); 
      } 
     } else { 
      super.onActivityResult(requestCode, resultCode, data); 
     } 
    } 
} 
+0

Serviceクラスは、私はこれを試してみましょうフィードバックをありがとうございました。 – Beginner

+0

それはあなたのために働くかどうか私に教えてください:) – Jayanth

+0

こんにちは@Jayanthなぜ私は 'finish()'があるのですか?それを実行した後すぐに私の活動を停止/閉じる 申し訳ありませんあなたがあなたの活動を閉じていないようにしたい場合は、 – Beginner

関連する問題