Добавить представление поверх всех видов деятельности
Я разрабатываю приложение для Android. Я хочу иметь возможность добавлять один вид по коду, который нарисован в верхней части всех действий в приложении.
Я попытался добавить его в диспетчер окон:
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. Макет не отвечает на события Click.
Есть ли еще одно решение для этого?
Спасибо.
Ответы
Ответ 1
Чтобы управлять представлением/представлением представления, я использовал решение, предложенное Гопалом.
Я привязывал события onStop и onResume, чтобы скрыть скрытие приложения при выходе из приложения.
Для событий click я понял, что тип тоста не отвечает на события click. Поэтому я изменил тип
params.type = WindowManager.LayoutParams.TYPE_TOAST;
to
params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
Я также должен добавить следующее разрешение:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
Ответ 2
измените LayoutParams
с TYPE_TOAST
на TYPE_APPLICATION
и удалите предыдущие флаги, которые я предложил,
и создайте один BaseActivity
для всех действий в вашем приложении, в этой Деятельности в onResume()
добавьте этот вид в WindowManager
и в onPause()
, удалите этот вид как,
windowManager.removeView(view);
Ответ 3
1) Создайте BaseActivity, который расширяет Activity.
2) Теперь ваша ваша деятельность должна расширять BaseActivity, а Activity
3) Переопределить метод setContentView().
4) создайте пустую вертикальную линейную задержку в этом методе.
5) Добавьте свой topView в этот макет
6) И затем добавьте завышенный вид в этот linearlayout
7) И, наконец, вызовите super.setContentView(passLinearLayoutHere)
Как это реализовать?
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);
}
}