Как программно наложить кнопку?
Чего я хотел бы добиться, так это поместить во время выполнения кнопку в середину экрана, как самый верхний слой, перекрывая все, что находится под ним. (Он не большой, поэтому он не будет полностью покрывать экран, как бы там ни было.)
Я посмотрел на создание собственного диалога, однако он блокирует все остальные пользовательские вводы. Я хочу, чтобы все представления под этой новой кнопкой работали нормально и отвечали пользователю, но я просто хочу добавить (а затем удалить) кнопку над всем.
Надеюсь, это имеет смысл. Мне просто интересно, что может быть лучшим подходом для изучения?
2 ответа
Используйте FrameLayout, с кнопкой в качестве второго ребенка. Установите его на GONE, если вы не хотите, чтобы он был видимым.
Мне пришлось программно наложить простой макет поверх любой видимой активности. Обычный макет активности xmls ничего не знает о наложении. Макет имеет один компонент textview, но может иметь любую структуру, которую вы считаете подходящей. Это мой макет наложения.
разреш / макет / identity.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/identitylayout"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_centerInParent="true" >
<TextView
android:id="@+id/identityview"
android:padding="5dp"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:textColor="#FFFFFF" android:background="#FF6600"
android:textSize="30dp"
/>
</RelativeLayout>
Наложение отображается поверх существующего содержимого после того, как тайм-аут удаляется с экрана. Приложение вызывает эту функцию для отображения наложения.
private void showIdentity(String tag, long duration) {
// default text with ${xx} placeholder variables
String desc = getString(R.string.identity);
desc = desc.replace("${id}", reqId!=null ? reqId : "RequestId not found" );
desc = desc.replace("${tag}", tag!=null ? tag : "" );
desc = desc.trim();
// get parent and overlay layouts, use inflator to parse
// layout.xml to view component. Reuse existing instance if one is found.
ViewGroup parent = (ViewGroup)findViewById(R.id.mainlayout);
View identity = findViewById(R.id.identitylayout);
if (identity==null) {
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
identity = inflater.inflate(R.layout.identity, parent, false);
parent.addView(identity);
}
TextView text = (TextView)identity.findViewById(R.id.identityview);
text.setText(desc);
identity.bringToFront();
// use timer to hide after timeout, make sure there's only
// one instance in a message queue.
Runnable identityTask = new Runnable(){
@Override public void run() {
View identity = findViewById(R.id.identitylayout);
if (identity!=null)
((ViewGroup)identity.getParent()).removeView(identity);
}
};
messageHandler.removeCallbacksAndMessages("identitytask");
messageHandler.postAtTime(identityTask, "identitytask", SystemClock.uptimeMillis()+duration);
}
Таймер messageHandler является членом основного экземпляра Activity (частный обработчик messageHandler), куда я помещаю все запланированные задачи. Я использую устройство Android 4.1 ниже, чем это, я не знаю, что происходит.