Вид на холст Видимость проблемы - PullRequest
4 голосов
/ 25 октября 2011

У меня есть этот макет:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >

<com.components.game.GameView
    android:id="@+id/game_id"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" />

<RelativeLayout
    android:id="@+id/ChatLayout"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:visibility="invisible"
    android:focusable="true"
    android:focusableInTouchMode="true" >

    <Button
        android:id="@+id/ChatCancelButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="X" />

    <Button
        android:id="@+id/ChatOkButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:text="OK" />

    <EditText
        android:id="@+id/ChatEditText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toLeftOf="@+id/ChatOkButton"
        android:layout_toRightOf="@+id/ChatCancelButton"
        android:maxLength="50"
        android:singleLine="true" />
</RelativeLayout>

</RelativeLayout>

Это RelativeLayout на холсте. Во время запуска он невидим, но когда пользователь нажимает кнопку, макет должен стать видимым. Проблема в том, что это не становится видимым. Макет есть, но он просто не рисует. Если я нажимаю позицию, в которой должен появиться макет, он получает событие и открывает клавиатуру, но он не рисует весь макет. В чем проблема?

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

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

chatLayout.postDelayed(new Runnable() {

        @Override
        public void run() {
            chatLayout.setVisibility(View.INVISIBLE);

        }
    }, 50);

Но мне это не нравится, и я хочу понять, в чем проблема.

код:

Он начинается с кнопки холста, которая отправляет сообщение обработчику:

public void showInputLayout() {
    Message.obtain(gameHandler, SHOW_INPUT_LAYOUT).sendToTarget();
}

В обработчике:

case SHOW_INPUT_LAYOUT:
                    gameActivity.setChatVisibility(true);
                    break;

setChatVisibility:

public void setChatVisibility(boolean isVisible) {
    int visible = isVisible ? View.VISIBLE : View.INVISIBLE;
    chatLayout.setVisibility(visible);
    if(isVisible){
        chatEditText.setFocusable(true);
        chatEditText.requestFocus();
    }
}

Ответы [ 2 ]

0 голосов
/ 02 ноября 2011

Недавно я столкнулся с подобной проблемой, и в моем случае проблема была в методе onDraw () представленного ниже представления (должно быть com.components.game.GameView в вашем случае). Посмотрите, можете ли вы добавить вызовы к Canvas 'getSaveCount(), save() и restoreToCount() в вашем коде чертежа, подобно этому:

@Override 
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    int saveCount = canvas.getSaveCount();
    canvas.save();

    // custom drawing code here ...
    // use Region.Op.INTERSECT for adding clipping regions

    canvas.restoreToCount(saveCount);
}

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

Надеюсь, это поможет.

0 голосов
/ 25 октября 2011

Добавьте прослушиватель кликов к RelativeLayout и переключите видимость между GONE и VISIBLE. Попробуйте что-то вроде этого:

int visibility = View.VISIBLE;
RelativeLayout layout = (RelativeLayout)findViewById(R.id.ChatLayout);
layout.setVisibility(visibility);
layout.setOnClickListener(new View.OnClickListener{
    public void onClick(View v)
    {
        if(visibility == View.VISIBLE)
            visibility = View.GONE;
        else
            visibility = View.VISIBLE;

        v.setVisibility(visibility);
    }
})
...