عیدی من به کاربران-آموزش شناور کردن یک لایه حتی با بستن برنامه




خوب ما برای طراحی نیازبه یک لایه داریم
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#ffacb0b5"> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/relativeLayout" android:gravity="right"> <View android:layout_width="match_parent" android:layout_height="60dp" android:background="#ff444bff" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/close_service" android:src="@drawable/close" android:layout_centerVertical="true" android:layout_alignParentRight="true" android:layout_alignParentEnd="true" android:layout_marginRight="10dp" /> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center|center_vertical|center_horizontal" android:layout_alignParentLeft="false" android:layout_alignParentStart="true" android:layout_below="@+id/relativeLayout"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="New Button" android:id="@+id/button" android:layout_marginTop="115dp" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="New Button" android:id="@+id/button2" android:layout_alignBottom="@+id/button" android:layout_centerHorizontal="true" android:layout_marginBottom="44dp" /> </RelativeLayout> </RelativeLayout>

در مرحله بعد ما برای اینکه بتونبم یک لایه رو تو صفحه ها داشته باشیم نیاز داریم که یک کلاس سرویس درست کنیم.
package float_button.example.com.float_button; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.app.Service; import android.content.Context; import android.content.Intent; import android.graphics.PixelFormat; import android.os.IBinder; import android.support.v4.app.NotificationCompat; import android.support.v4.app.NotificationCompat.Builder; import android.view.Gravity; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.WindowManager; import android.widget.Button; import android.widget.ImageView; import android.widget.Toast; /** * Created by shadow on 7/6/2015. */ public class float_layout extends Service { private WindowManager windowManager; private LayoutInflater _layOutInflater; private View floatView; private Button btn1; private ImageView close_service; private int notifyId = 0; @Override public IBinder onBind(Intent intent) { // Not used return null; } @Override public void onCreate() { super.onCreate(); windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); _layOutInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); 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); params.gravity = Gravity.TOP | Gravity.CENTER; params.x = 0; params.y = 100; floatView = _layOutInflater.inflate(R.layout.float1, null); windowManager.addView(floatView, params); close_service=(ImageView)floatView.findViewById(R.id.close_service); btn1=(Button)floatView.findViewById(R.id.button); close_service.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { stopSelf(); } }); btn1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getBaseContext(), "clicked", Toast.LENGTH_LONG).show(); } }); floatView.setOnTouchListener(new View.OnTouchListener() { public int initialX; public int initialY; public float initialTouchX; public float initialTouchY; @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: initialX = params.x; initialY = params.y; initialTouchX = event.getRawX(); initialTouchY = event.getRawY(); return true; case MotionEvent.ACTION_UP: return true; case MotionEvent.ACTION_MOVE: params.x = initialX + (int) (event.getRawX() - initialTouchX); params.y = initialY + (int) (event.getRawY() - initialTouchY); windowManager.updateViewLayout(floatView, params); return true; } return false; } }); } @Override public void onDestroy() { super.onDestroy(); if (floatView != null) windowManager.removeView(floatView); } }

بعد این پرمیشن رو به منیفست اضافه میکنیم.
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
و در آخر واسه اجرا سرویس این کد رو داخل یک کلاس دیگه میزاریم
startService(new Intent(MainActivity.this, float_layout.class));

برنامه پیاده سازی شد ولیکن هنگام صدا زدن کلاس float_layout هیچ اتفاقی نمیافتد (permision مربوطه نیز در manifest اضافه گردیده)

منم تست کردم درسته و کامل اجرا شد
ولی همین مورد دوستمون رو چک کردم کیبورد باز نمیشه !
بعد یه سوال دیگه موقعی که به این سرویس منتقل میشیم از طریق کد زیر :
startService(newIntent(MainActivity.this, float_layout.class));
چطور میشه مثل اکتیویتی ( putExtra ) و یا مقادیر ارسال کنیم ؟
ویرایش : میشه همون طور ارسال کرد ولی برا گرفتنش احتمالا باید از متد onStartCommand استفاده کرد : لینک

دوستان من هرکاری میکنم در منی فست از سرویس خطا میگیره

من اینو تو منیفست اضافه کردم حل شد (شما باید نام پکیج خودتون رو بنویسید)
<service
android:name="com.example.floatapp.float_layout"
android:label="@string/app_name" >
</service >

سلام
برای اینکه امکان باز شدن کیبورد ایجاد بشه کد زیر را به جای مشابهش در کدهای بالا قرار دهید
final WindowManager.LayoutParamsparams=newWindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_PHONE, WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
| WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
PixelFormat.TRANSLUCENT);

سلام دوستان عزیز .
omidronaldoo ممنون ازت . خیلی وقت بود دنبال این کد بودم .
چند نفری مشکل داشتند گفتم پروژه کاملش رو اینجا بگذارم تا هرکی مشکل داشت دانلود کنه و ایمپورت کنه
اینم لینک دانلود : دانلود فایل
موفق باشید :)

ای بابا
این چرا اینجوریه پروژه شمارو میتونه اجرا کنه ولی من همون پروژه رو کپی میکنم هم اجرا نمیکنه

دوستان توجه کنید:
من این خط کد رو توی AdapterNote صدا زدم، ولی ارور گرفت که startService رو نمیشناسه.
راح حلش اینه که اسم اکتیویتی رو اولش اضافه کنی که اگه طبق آموزش استاد کلاس G را تعریف کرده باشید فقط کافیه این طور بنویسید:
G.currentActivity.startService(newIntent(MainActivity.this, float_layout.class));

دوستان چرا وقتی از لایه شناور استفاده میکنیم دکمه back گوشی دیکه کار نمیکنه؟
البته وقتی که از کد مربوط به کیبورد استفاده میشود

با سلام
قصد دارم با کلیک شدن آیکن درون لایه شناور،اکتیویتیه مینیمایز شده رو بیاره بالا و از کد زیر استفاده کردم ولی کرش میکنه، لطفأ راهنمایی بفرمایید
close_service.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//stopSelf();
Intent intent2 = new Intent(float_layout.this, WindwoActivity.class);
intent2.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent2);
}
});
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .