Как программно наложить кнопку? - PullRequest
0 голосов
/ 21 октября 2010

Что я хотел бы сделать, так это поместить во время выполнения кнопку в середину экрана, как самый верхний слой, перекрывая все, что находится под ним. (Он не большой, поэтому он не будет полностью покрывать экран, как бы там ни было.)

Я смотрел на создание собственного диалога, однако он блокирует все остальные пользовательские вводы. Я хочу, чтобы все представления под этой новой кнопкой работали нормально и отвечали пользователю, но я просто хочу добавить (а затем удалить) кнопку над всем.

Надеюсь, это имеет смысл. Мне просто интересно, что может быть лучшим подходом для изучения?

Ответы [ 2 ]

2 голосов
/ 21 октября 2010

Используйте FrameLayout , с кнопкой в ​​качестве второго ребенка.Установите его на GONE, если вы не хотите, чтобы он был виден.

1 голос
/ 10 января 2013

Мне пришлось программно наложить простой макет поверх любого видимого действия. Обычный макет активности 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 ниже, чем это, я не знаю, что происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...