1

Как, после вставки маленького фрагмента, после большого, FrameLayout возвращался до размеров маленького? Я пытался это делать через:

            ((FrameLayout) findViewById(R.id.frameLayout1_wordsAdd)).getLayoutParams().height = LayoutParams.WRAP_CONTENT;
            ((LinearLayout) findViewById(R.id.linearLayout1_wordsAdd)).getLayoutParams().height = LayoutParams.WRAP_CONTENT;

Но безуспешно.

Чтобы было понятнее, вот, что выходит:

введите сюда описание изображениявведите сюда описание изображениявведите сюда описание изображения

Вот .xml разметка:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="45dp"
    android:layout_margin="3dp"
    android:background="@color/white"
    android:orientation="horizontal" >

    <Spinner
        android:id="@+id/spinner_forms"
        android:layout_width="match_parent"
        android:layout_height="45dp" />
</LinearLayout>

<FrameLayout
    android:id="@+id/frameLayout1_wordsAdd"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="3dp"
    android:layout_marginRight="3dp" >
</FrameLayout>

<Button
    android:id="@+id/btnOK_wordsadd"
    android:layout_width="300dp"
    android:layout_height="40dp"
    android:layout_margin="3dp"
    android:background="@drawable/button1"
    android:text="Готово" />

Для ЮрийСПб:

При попытке сделать FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) fr.getLayoutParams(); вылетает. Вот сообщения из logcat`a:

10-14 22:01:56.509: ERROR/(675): Could not open '/data/data/hotplug/cmd'
10-14 22:01:56.509: ERROR/(675): error : 2, No such file or directory
10-14 22:01:56.538: ERROR/(142): AudioCloseDumpPCMFile file== NULL
10-14 22:01:56.547: ERROR/(142): AudioCloseDumpPCMFile file== NULL
10-14 22:01:56.570: ERROR/SQLiteLog(7739): (10) Failed to do file read, got: 0, amt: 100, last Errno: 2
10-14 22:01:56.695: ERROR/(675): Could not open '/data/data/hotplug/cmd'
10-14 22:01:56.695: ERROR/(675): error : 2, No such file or directory
10-14 22:01:57.551: ERROR/ActivityThread(5776): Failed to find provider info for com.example.dictionarydemo_2.YPLContentProvider
10-14 22:01:57.705: ERROR/ActivityThread(4486): Failed to find provider info for com.example.dictionarydemo_2.MetricaContentProvider
10-14 22:01:57.841: ERROR/AccountProvider(7725): query content://com.yandex.auth.maps/retail from ru.yandex.yandexmaps
10-14 22:01:57.842: ERROR/DatabaseUtils(7725): Writing exception to parcel
10-14 22:01:57.842: ERROR/DatabaseUtils(7725): java.lang.UnsupportedOperationException: com.yandex.auth.maps: try to query to content://com.yandex.auth.maps/retail selection null
10-14 22:01:57.842: ERROR/DatabaseUtils(7725):     at com.yandex.auth.AccountProvider.query(SourceFile:102)
10-14 22:01:57.842: ERROR/DatabaseUtils(7725):     at android.content.ContentProvider.query(ContentProvider.java:904)
10-14 22:01:57.842: ERROR/DatabaseUtils(7725):     at android.content.ContentProvider$Transport.query(ContentProvider.java:234)
10-14 22:01:57.842: ERROR/DatabaseUtils(7725):     at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:112)
10-14 22:01:57.842: ERROR/DatabaseUtils(7725):     at android.os.Binder.execTransact(Binder.java:404)
10-14 22:01:57.842: ERROR/DatabaseUtils(7725):     at dalvik.system.NativeStart.run(Native Method)
10-14 22:01:57.916: ERROR/AccountProvider(7725): query content://com.yandex.auth.maps/retail from ru.yandex.yandexmaps
10-14 22:01:57.917: ERROR/DatabaseUtils(7725): Writing exception to parcel
10-14 22:01:57.917: ERROR/DatabaseUtils(7725): java.lang.UnsupportedOperationException: com.yandex.auth.maps: try to query to content://com.yandex.auth.maps/retail selection null
10-14 22:01:57.917: ERROR/DatabaseUtils(7725):     at com.yandex.auth.AccountProvider.query(SourceFile:102)
10-14 22:01:57.917: ERROR/DatabaseUtils(7725):     at android.content.ContentProvider.query(ContentProvider.java:904)
10-14 22:01:57.917: ERROR/DatabaseUtils(7725):     at android.content.ContentProvider$Transport.query(ContentProvider.java:234)
10-14 22:01:57.917: ERROR/DatabaseUtils(7725):     at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:112)
10-14 22:01:57.917: ERROR/DatabaseUtils(7725):     at android.os.Binder.execTransact(Binder.java:404)
10-14 22:01:57.917: ERROR/DatabaseUtils(7725):     at dalvik.system.NativeStart.run(Native Method)
10-14 22:01:58.581: ERROR/NativeCrypto(19240): ssl=0x6dde66d0 cert_verify_callback x509_store_ctx=0x6e515938 arg=0x0
10-14 22:01:58.582: ERROR/NativeCrypto(19240): ssl=0x6dde66d0 cert_verify_callback calling verifyCertificateChain authMethod=ECDHE_RSA
10-14 22:01:59.134: ERROR/panhongyang(870): liantong 2g level=4 asu=30 dBm=-53
10-14 22:01:59.135: ERROR/panhongyang(675): liantong 2g level=4 asu=30 dBm=-53
10-14 22:01:59.135: ERROR/panhongyang(780): liantong 2g level=4 asu=30 dBm=-53
10-14 22:01:59.137: ERROR/panhongyang(780): liantong 2g level=4 asu=30 dBm=-53
10-14 22:01:59.906: ERROR/RemoteViews(675): ANR Warning,RemoteViews can only be used once ,if not ,it may cause ANR in hosts such as Laucher,SystemUI. keys for search <ANR Exception MSG   History>
10-14 22:01:59.907: ERROR/RemoteViews(675): ANR Warning,RemoteViews can only be used once ,if not ,it may cause ANR in hosts such as Laucher,SystemUI. keys for search <ANR Exception MSG   History>
10-14 22:02:01.528: ERROR/(675): Could not open '/data/data/hotplug/cmd'
10-14 22:02:01.528: ERROR/(675): error : 2, No such file or directory
10-14 22:02:01.556: ERROR/(675): Could not open '/data/data/hotplug/cmd'
10-14 22:02:01.556: ERROR/(675): error : 2, No such file or directory
10-14 22:02:01.570: ERROR/SQLiteLog(7739): (10) Failed to do file read, got: 0, amt: 100, last Errno: 2
10-14 22:02:01.682: ERROR/NotificationService(675): n=0
10-14 22:02:01.682: ERROR/NotificationService(675): mLights.size()=0
10-14 22:02:03.064: ERROR/AccountProvider(7725): query content://com.yandex.auth.maps/retail from ru.yandex.yandexmaps
10-14 22:02:03.065: ERROR/DatabaseUtils(7725): Writing exception to parcel
10-14 22:02:03.065: ERROR/DatabaseUtils(7725): java.lang.UnsupportedOperationException: com.yandex.auth.maps: try to query to content://com.yandex.auth.maps/retail selection null
10-14 22:02:03.065: ERROR/DatabaseUtils(7725):     at com.yandex.auth.AccountProvider.query(SourceFile:102)
10-14 22:02:03.065: ERROR/DatabaseUtils(7725):     at android.content.ContentProvider.query(ContentProvider.java:904)
10-14 22:02:03.065: ERROR/DatabaseUtils(7725):     at android.content.ContentProvider$Transport.query(ContentProvider.java:234)
10-14 22:02:03.065: ERROR/DatabaseUtils(7725):     at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:112)
10-14 22:02:03.065: ERROR/DatabaseUtils(7725):     at android.os.Binder.execTransact(Binder.java:404)
10-14 22:02:03.065: ERROR/DatabaseUtils(7725):     at dalvik.system.NativeStart.run(Native Method)
10-14 22:02:03.155: ERROR/AccountProvider(7725): query content://com.yandex.auth.maps/retail from ru.yandex.yandexmaps
10-14 22:02:03.156: ERROR/DatabaseUtils(7725): Writing exception to parcel
10-14 22:02:03.156: ERROR/DatabaseUtils(7725): java.lang.UnsupportedOperationException: com.yandex.auth.maps: try to query to content://com.yandex.auth.maps/retail selection null
10-14 22:02:03.156: ERROR/DatabaseUtils(7725):     at com.yandex.auth.AccountProvider.query(SourceFile:102)
10-14 22:02:03.156: ERROR/DatabaseUtils(7725):     at android.content.ContentProvider.query(ContentProvider.java:904)
10-14 22:02:03.156: ERROR/DatabaseUtils(7725):     at android.content.ContentProvider$Transport.query(ContentProvider.java:234)
10-14 22:02:03.156: ERROR/DatabaseUtils(7725):     at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:112)
10-14 22:02:03.156: ERROR/DatabaseUtils(7725):     at android.os.Binder.execTransact(Binder.java:404)
10-14 22:02:03.156: ERROR/DatabaseUtils(7725):     at dalvik.system.NativeStart.run(Native Method)
10-14 22:02:03.981: ERROR/(675): Could not open '/data/data/hotplug/cmd'
10-14 22:02:03.981: ERROR/(675): error : 2, No such file or directory
10-14 22:02:04.026: ERROR/(675): Could not open '/data/data/hotplug/cmd'
10-14 22:02:04.026: ERROR/(675): error : 2, No such file or directory
10-14 22:02:13.100: ERROR/panhongyang(870): liantong 2g level=4 asu=27 dBm=-59
10-14 22:02:13.102: ERROR/panhongyang(675): liantong 2g level=4 asu=27 dBm=-59
10-14 22:02:13.102: ERROR/panhongyang(780): liantong 2g level=4 asu=27 dBm=-59
10-14 22:02:13.104: ERROR/panhongyang(780): liantong 2g level=4 asu=27 dBm=-59
10-14 22:02:13.862: ERROR/(675): Could not open '/data/data/hotplug/cmd'
10-14 22:02:13.862: ERROR/(675): error : 2, No such file or directory
10-14 22:02:13.980: ERROR/AndroidRuntime(7739): FATAL EXCEPTION: main
10-14 22:02:13.980: ERROR/AndroidRuntime(7739): Process: com.example.dictionarydemo_2, PID: 7739
10-14 22:02:13.980: ERROR/AndroidRuntime(7739): java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams cannot be cast to android.widget.FrameLayout$LayoutParams
10-14 22:02:13.980: ERROR/AndroidRuntime(7739):     at com.example.dictionarydemo_2.AddWord$1.onItemSelected(AddWord.java:45)
10-14 22:02:13.980: ERROR/AndroidRuntime(7739):     at android.widget.AdapterView.fireOnSelected(AdapterView.java:893)
10-14 22:02:13.980: ERROR/AndroidRuntime(7739):     at android.widget.AdapterView.access$200(AdapterView.java:48)
10-14 22:02:13.980: ERROR/AndroidRuntime(7739):     at android.widget.AdapterView$SelectionNotifier.run(AdapterView.java:861)
10-14 22:02:13.980: ERROR/AndroidRuntime(7739):     at android.os.Handler.handleCallback(Handler.java:808)
10-14 22:02:13.980: ERROR/AndroidRuntime(7739):     at android.os.Handler.dispatchMessage(Handler.java:103)
10-14 22:02:13.980: ERROR/AndroidRuntime(7739):     at android.os.Looper.loop(Looper.java:193)
10-14 22:02:13.980: ERROR/AndroidRuntime(7739):     at android.app.ActivityThread.main(ActivityThread.java:5292)
10-14 22:02:13.980: ERROR/AndroidRuntime(7739):     at java.lang.reflect.Method.invokeNative(Native Method)
10-14 22:02:13.980: ERROR/AndroidRuntime(7739):     at java.lang.reflect.Method.invoke(Method.java:515)
10-14 22:02:13.980: ERROR/AndroidRuntime(7739):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824)
10-14 22:02:13.980: ERROR/AndroidRuntime(7739):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640)
10-14 22:02:13.980: ERROR/AndroidRuntime(7739):     at dalvik.system.NativeStart.main(Native Method)

Код, который вышел, после добавления удаления фрагментов:

    spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        public void onItemSelected(AdapterView<?> parent, View itemSelected, int selectedItemPosition, long selectedId) {
            switch (form) {
            case 1:
                if (selectedItemPosition == 1) {
                    FragmentTransaction fTransaction = getFragmentManager().beginTransaction();
                    fTransaction.remove(new WordsAddForm1_Fragment());
                    fTransaction.commit();

                    FrameLayout fr = (FrameLayout) findViewById(R.id.frameLayout1_wordsAdd);
                    LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) fr.getLayoutParams();
                    params.height = LayoutParams.WRAP_CONTENT;
                    fr.setLayoutParams(params);

                    fTransaction = getFragmentManager().beginTransaction();
                    fTransaction.add(R.id.frameLayout1_wordsAdd, new WordsAddForm2_Fragment());
                    fTransaction.commit();
                    form = 2;
                }
                break;
            case 2:
                if (selectedItemPosition == 0) {
                    FragmentTransaction fTransaction = getFragmentManager().beginTransaction();
                    fTransaction.remove(new WordsAddForm2_Fragment());
                    fTransaction.commit();

                    FrameLayout fr = (FrameLayout) findViewById(R.id.frameLayout1_wordsAdd);
                    LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) fr.getLayoutParams();
                    params.height = LayoutParams.WRAP_CONTENT;
                    fr.setLayoutParams(params);

                    fTransaction = getFragmentManager().beginTransaction();
                    fTransaction.add(R.id.frameLayout1_wordsAdd, new WordsAddForm1_Fragment());
                    fTransaction.commit();
                    form = 1;
                }
            }
        }
pavlofff
  • 36,765

1 Answers1

2

Тут

((FrameLayout) findViewById(R.id.frameLayout1_wordsAdd)).getLayoutParams().height = LayoutParams.WRAP_CONTENT;

вы назначаете значение полю объекта, но потом этот объект не присваиваете FrameLayout. Засим надо ещё и LayoutParams присвоить вьюхе:

 FrameLayout fr=(FrameLayout) findViewById(R.id.frameLayout1_wordsAdd);
 FrameLayout.LayoutParams params=(FrameLayout.LayoutParams)fr.getLayoutParams();
 params.height = LayoutParams.WRAP_CONTENT;
 fr.setLayoutParams(params);

UPD_0:

При этом класс перед LayoutParams должен быть родительским для того вью, чьи LayoutParams мы получаем. Т.е., если наш FrameLayout лежит в LinearLayout, то класс LayoutParams будет выглядеть LinearLayout.LayoutParams


Так же при замене одного фрагмента другим надо сначала удалить фрагмент методом remove, а потом добавить методом add. При использовании replace, судя по всему, фрагменты из разметки не удаляются, а как бы становятся невидимыми, из-за чего контейнер принимает размеры самого большого лежащего в нём фрагмента.

Т.е. примерно так:

spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
    {
        public void onItemSelected(AdapterView<?> parent, View itemSelected, int selectedItemPosition, long selectedId)
        {
            FragmentTransaction fTransaction;
            //находим добавленный фрагмент и его удаляем
            //а не пытаемся удалить несуществующий фрагмент
            Fragment fragmentToRemove = getFragmentManager().findFragmentByTag("myFragmentTag");
            if (fragmentToRemove != null)
            {
                fTransaction = getFragmentManager().beginTransaction();
                fTransaction.remove(fragmentToRemove);
                fTransaction.commit();
            }

            //возможно это даже и не нужно, если мы удаляем фрагмент
            FrameLayout fr = (FrameLayout) findViewById(R.id.frameLayout1_wordsAdd);
            LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) fr.getLayoutParams();
            params.height = LinearLayout.LayoutParams.WRAP_CONTENT;
            fr.setLayoutParams(params);

            switch (selectedItemPosition)
            {
                case 0:
                    fTransaction = getFragmentManager().beginTransaction();
                    //добавляем фрагмент с тегом по коему будем искать
                    fTransaction.add(R.id.frameLayout1_wordsAdd, new WordsAddForm1_Fragment(), "myFragmentTag");
                    fTransaction.commit();
                    break;
                case 1:
                    fTransaction = getFragmentManager().beginTransaction();
                    //добавляем фрагмент с тегом по коему будем искать
                    fTransaction.add(R.id.frameLayout1_wordsAdd, new WordsAddForm2_Fragment(), "myFragmentTag");
                    fTransaction.commit();
                    break;
            }
        }
    });
}
  • На строке FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) fr.getLayoutParams();" вылетает. –  Oct 14 '15 at 18:59
  • 1
    Замените фрэйм на его родительский элемент. Наверное линеар – ЮрийСПб Oct 14 '15 at 19:02
  • Эм... А у него нет родительского элемента. Он лежит в главном LinearLayout, в котором находится все остальное. –  Oct 14 '15 at 19:03
  • 1
    Замените FrameLayout.LayoutParams на линеар.лэйаутпарамс – ЮрийСПб Oct 14 '15 at 19:06
  • Заменил. Теперь программа работает, но как и работала. Теперь окно не уменьшается :(. –  Oct 14 '15 at 19:09
  • 1
    Вы фрагменты заменяете? Если да, то попооьуйте удалять старый и добавлять новый – ЮрийСПб Oct 14 '15 at 19:12
  • Сначала удалить, уменьшить окно, а потом добавить новый? –  Oct 14 '15 at 19:16
  • 1
    Типа того....... – ЮрийСПб Oct 14 '15 at 19:17
  • А как очистить FrameLayout, если не знаешь, что в нем? Или что будет, если попытаться удалить не то, что в нем? –  Oct 14 '15 at 19:35
  • 1
    Ну... ошибку выкинет, если вы что-то не то сделаете. Её поймать можно. И вы точно должны знать, что в нём хранится. Вы ж сами в него что-то помещаете... – ЮрийСПб Oct 14 '15 at 19:41
  • Изначально я могу поместить первый фрейм, но потом работает пользователь, а значит — выбирает он. –  Oct 14 '15 at 19:47
  • 1
    Помечайте каждый фрагмент добавляемый тэгом. При смене по тегу находите, уаляйте, добавляйте новый с тем же тегом. – ЮрийСПб Oct 14 '15 at 20:02
  • Я так и подумал про тег! Ну... Переменную, в которую будет вестись запись. Теперь все работает! Только кнопки почему-то наоборот, но это не важно. Главное — работает! :D –  Oct 14 '15 at 20:33
  • Не работает. :\ Снова не меняется размер FrameLayout. Я добавил код в вопрос. –  Oct 14 '15 at 20:37
  • Я засунул FrameLayout в LinearLayout, менял параметры LinearLayout, но результат тот же. –  Oct 14 '15 at 20:52
  • Я понял! Оно не убирается, потому что я удаляю не тот фрагмент, а другой экземпляр! –  Oct 14 '15 at 20:55
  • Верно. Смотрите обновление ответа, я вам прямо всё написал. И таки почитайте книжку любую о яве и андроиде. Сразу многое станет понятным. – ЮрийСПб Oct 14 '15 at 20:59
  • Почитаю, но когда ноутбук куплю (читать, когда постоянно родители выгоняют из-за компьютера невозможно), собственно для этого я и пишу приложение (еще 2 в задумке), а может еще что-то и придумаю (ведь 3 приложения это так мало, а ноутбуки стоят от 7к в Украине). Кстати, не скажите название книги, которую читали Вы? –  Oct 14 '15 at 21:04
  • Таки 7к рублей же вообще не деньги же, читай даром) А список книг по Java можно тут смотреть: http://ru.stackoverflow.com/questions/416634/ По андроиду - просто берите самую последнюю по дате написания - там максимально релевантная инфа. – ЮрийСПб Oct 14 '15 at 21:11