Переключение между представлениями в FrameLayout из дочернего представления

#android #android-edittext #android-linearlayout #surfaceview #android-framelayout

#Android #android-редактировать текст #android-linearlayout #surfaceview #android-framelayout

Вопрос:

В настоящее время у меня есть SurfaceView (с именем BoardView), который хранится в FrameLayout. В этом FrameLayout (f1) хранится другое LinearLayout (l1), которое содержит EditText. Я хочу иметь возможность выводить EditText на передний план из моего BoardView. Возможно ли это? Я пытался использовать getParent().bringChildToFront(); но это не сработало. Есть идеи?

 public class Board extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);

    //use a frame layout so you can also display a dialog box
    // allows more than one view to be used
    FrameLayout f1 = new FrameLayout(this);
    LinearLayout l1 = new LinearLayout(this);
    EditText edit = new EditText(this);

    l1.setOrientation(LinearLayout.VERTICAL);
    l1.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, 
            LayoutParams.WRAP_CONTENT));
    edit.setText("Enter your name!");
    l1.addView(edit);

    f1.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, 
            LayoutParams.FILL_PARENT));
    f1.addView(l1);
    f1.addView(new BoardView(this));

    setContentView(f1);

    //setContentView(new BoardView(this));
}
  

}

Ответ №1:

Звучит довольно глупо, но попробуйте l1.bringToFront() и посмотрите, работает ли это? В качестве альтернативы просто добавьте l1 второе:

 f1.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, 
            LayoutParams.FILL_PARENT));
    f1.addView(new BoardView(this));
    f1.addView(l1);
  

и текст редактирования будет сверху.

Дайте мне знать, если это сработает.

Комментарии:

1. Дело в том, что «l1» не может быть разрешено. Я хочу показывать l1 ТОЛЬКО тогда, когда что-то происходит в SurfaceView. В принципе, когда игра заканчивается, я хочу показать это новое представление. Думаю, я мог бы сделать текущее представление невидимым, верно?

2. Ах, так вот в чем вопрос: покажите код, в котором вы производите переключение

3. Ну, на самом деле фрагмент кода довольно длинный. У меня есть пользовательский SurfaceView — там недостаточно места для размещения кода здесь:/ Что я должен сделать, чтобы показать вам? Название моего класса выглядит примерно так. общедоступный класс BoardView расширяет SurfaceView, реализует SurfaceHolder. Обратный вызов{

4. Есть ли проблема, потому что это пользовательский класс? Наверняка должен быть какой-то способ сделать это.

5. Не должно иметь значения. Проблема не устранена только потому, что ваш пользовательский класс не имеет видимости l1 объекта. Я бы предложил присвоить идентификаторы l1 , а затем использовать идентификатор: так сделайте l1.setId(1); в onCreate приведенном выше, а затем в вашем пользовательском классе используйте ((View)getParent()).findViewById(1).bringToFront(); для обновления z-порядка.