Как получить новую ширину/высоту макета корня в OnConfigurationChanged?

StackOverflow https://stackoverflow.com/questions/2524683

Вопрос

Один из наших взглядов имеет ScrollView как его корневой макет. Когда устройство повернуто и onConfigurationChanged() называется, мы хотели бы получить ScrollViewНовая ширина/высота. Наш код выглядит так:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    Log.d(TAG, "Width: '" + findViewById(R.id.scrollview).getWidth() + "'");
    Log.d(TAG, "Height: '" + findViewById(R.id.scrollview).getHeight() + "'");

    super.onConfigurationChanged(newConfig);

    Log.d(TAG, "Width: '" + findViewById(R.id.scrollview).getWidth() + "'");
    Log.d(TAG, "Height: '" + findViewById(R.id.scrollview).getHeight() + "'");
}

Соответствующий раздел нашего AndroidManifest.xml выглядит так:

<activity android:name=".SomeActivity"
    android:configChanges="keyboardHidden|orientation">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
    </intent-filter>
</activity>

И, наконец, соответствующая часть нашего макета выглядит так:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/scrollview"
    android:layout_height="fill_parent"
    android:layout_width="fill_parent"
    >
    <LinearLayout android:id="@+id/container"
        android:orientation="vertical"
        android:layout_height="fill_parent"
        android:minHeight="200dip"
        android:layout_width="fill_parent"
        >

На нашем дроиде мы ожидали увидеть, как ширина Scrollview перейдет на 854 при переключении на ландшафт, а 480 при переключении обратно на портрет (а высота выполняет эквивалентный переключатель, минус стержень меню). Однако мы видим наоборот. Вот наш Logcat:

// Switching to landscape:
03-26 11:26:16.490: DEBUG/ourtag(17245): Width: '480'  // Before super
03-26 11:26:16.490: DEBUG/ourtag(17245): Height: '778' // Before super
03-26 11:26:16.529: DEBUG/ourtag(17245): Width: '480'  // After super
03-26 11:26:16.536: DEBUG/ourtag(17245): Height: '778' // After super

// Switching to portrait:
03-26 11:26:28.724: DEBUG/ourtag(17245): Width: '854'  // Before super
03-26 11:26:28.740: DEBUG/ourtag(17245): Height: '404' // Before super
03-26 11:26:28.740: DEBUG/ourtag(17245): Width: '854'  // After super
03-26 11:26:28.740: DEBUG/ourtag(17245): Height: '404' // After super

Очевидно, что мы получаем портретные размеры, когда переключаемся на пейзаж, и размеры ландшафта, когда переключаемся на портрет. Что -то мы делаем не так? Мы могли бы получить хакерство и решить это, но я чувствую, что есть простое решение, которое нам не хватает.

Это было полезно?

Решение

, глядя на вашу репутацию, я не уверен, что вы никогда не слышали о находных столбцах, как объяснены в этом Статья MSDN Они делают именно то, что вы хотите, но только разница в том, что они играют с кучейбананов и ваших с инструментами;)

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

Редактировать

С момента вашего поиска xsltlistviewwebpart вы можете использовать CAML Joins и прогнозы, как объяснено в книге SharePoint 2010 в качестве платформы разработки >

Другие советы

Когда когда-либо вы создаете новый сайт, страницу, библиотека или список, у вас есть возможность не отображать их в Quicklaunch.Страницы являются исключением, но это можно настроить на странице настроек навигации на каждом сайте.

Если вы не хотите, чтобы это по умолчанию по умолчанию, вы всегда можете редактировать свою Masterpage в SharePoint Designer и найдите элемент управления «TopnavigationMemmenUv4» (в SP2010) и установите его свойства GeneracodicCode и StaticDisplayLevels для отображения 1 или 0 уровней.То же самое касается контроля Quicklaunch "Currentnav" (такие же свойства).

Когда ongloballayout назвал, не уверен, что представление было изменено соответственно с новой ориентацией макета, поэтому для меня только предпринимаемое решение сработало правильно:

@Override
public void onConfigurationChanged(Configuration newConfig) {
final int oldHeight = mView.getHeight();
final int oldWidth = mView.getWidth();

mView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            if (mView.getHeight() != oldHeight && mView.getWidth() != oldWidth) {
                mView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                //mView now has the correct dimensions, continue with your stuff
            }
        }
    });
    super.onConfigurationChanged(newConfig);}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top