Не можете динамически добавить фрагмент, если он находится внутри ScrollView?

Я пытаюсь динамически добавить фрагмент в свой XML-макет. Расположение:

<ScrollView
    android:id = "@+id/scrollView1"
    android:layout_above = "@+id/buttonLayout"
    android:layout_width = "match_parent"
    android:layout_height = "match_parent">

    <RelativeLayout
        android:id = "@+id/rellayout1"
        android:layout_width = "match_parent"
        android:layout_height = "wrap_content"
        android:orientation = "vertical"
        android:padding = "5dp">

        <fragment
            android:id = "@+id/fragment1"
            android:name = "com.amaj.notetakertest.TopSectionFragment"
            android:layout_width = "match_parent"
            android:layout_height = "359dp" />

        <EditText
            android:id = "@+id/et_main"
            android:layout_width = "match_parent"
            android:layout_height = "wrap_content"
            android:layout_below = "@+id/fragment1"/>

    </RelativeLayout>

</ScrollView>

Я пытаюсь динамически добавить еще один фрагмент (назовите его fragment2) к rellayout1 внутри ScrollView, как показано выше. Но приложение вылетает при динамическом добавлении фрагмента 2.

Сбой не произойдет, если я удалю ScrollView из макета, а затем динамически добавлю фрагмент в rellayout1. Этого также не происходит, если я динамически добавляю фрагмент в другие макеты за пределами ScrollView. Мой вопрос: что именно в ScrollView вызывает дисфункцию?

Код для динамического добавления фрагмента следующий:

    RelativeLayout rl = (RelativeLayout) findViewById(R.id.rellayout1);

    TopSectionFragment f = new TopSectionFragment();
    FragmentManager fm = getSupportFragmentManager();
    android.support.v4.app.FragmentTransaction fTrans = fm.beginTransaction();
    fTrans.add(rl.getId(), f);
    fTrans.addToBackStack(null);
    fTrans.commit();

Приведенный выше код Java запускается, когда происходит событие щелчка.

Чтобы уточнить, класс TopSectionFragment действительно расширяет android.support.v4.app.Fragment, и в остальном все в классе нормально. Я прекрасно могу добавить фрагмент в другие макеты. Просто всякий раз, когда я пытаюсь добавить его в макет, который является внутри a ScrollView, он вылетает. Пробовал самостоятельно с другими тестовыми приложениями. Я думаю, это также не отсутствие LayoutParams, потому что проблема не исчезнет, ​​даже если я добавлю LayoutParams.

Что мне не хватает?

Обновлено: Вот журнал:

05-01 21:32:29.010 27452-27469/com.amaj.notetakertest E/EGL_emulation: tid 
27469: eglSurfaceAttrib(1146): error 0x3009 (EGL_BAD_MATCH)
05-01 21:32:33.207 27452-27452/com.amaj.notetakertest E/AndroidRuntime: 
FATAL EXCEPTION: main
    Process: com.amaj.notetakertest, PID: 27452
    java.lang.IllegalArgumentException: width and height must be > 0
    at android.graphics.Bitmap.createBitmap(Bitmap.java:877)
    at android.graphics.Bitmap.createBitmap(Bitmap.java:856)
    at android.graphics.Bitmap.createBitmap(Bitmap.java:823)
    at com.amaj.notetakertest.CanvasView.onSizeChanged(CanvasView.java:46)
    at android.view.View.sizeChange(View.java:17641)
    at android.view.View.setFrame(View.java:17603)
    at android.view.View.layout(View.java:17520)
    at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1079)
    at android.view.View.layout(View.java:17523)
    at android.view.ViewGroup.layout(ViewGroup.java:5612)
    at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1079)
    at android.view.View.layout(View.java:17523)
    at android.view.ViewGroup.layout(ViewGroup.java:5612)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
    at android.widget.ScrollView.onLayout(ScrollView.java:1535)
    at android.view.View.layout(View.java:17523)
    at android.view.ViewGroup.layout(ViewGroup.java:5612)
    at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1079)
    at android.view.View.layout(View.java:17523)
    at android.view.ViewGroup.layout(ViewGroup.java:5612)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
    at android.view.View.layout(View.java:17523)
    at android.view.ViewGroup.layout(ViewGroup.java:5612)
    at android.support.v7.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:443)
    at android.view.View.layout(View.java:17523)
    at android.view.ViewGroup.layout(ViewGroup.java:5612)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
    at android.view.View.layout(View.java:17523)
    at android.view.ViewGroup.layout(ViewGroup.java:5612)
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741)
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585)
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1494)
    at android.view.View.layout(View.java:17523)
    at android.view.ViewGroup.layout(ViewGroup.java:5612)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
    at com.android.internal.policy.DecorView.onLayout(DecorView.java:724)
    at android.view.View.layout(View.java:17523)
    at android.view.ViewGroup.layout(ViewGroup.java:5612)
    at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2342)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2069)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1246)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6301)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:871)
    at android.view.Choreographer.doCallbacks(Choreographer.java:683)
    at android.view.Choreographer.doFrame(Choreographer.java:619)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:857)
    at android.os.Handler.handleCallback(Handler.java:751)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6077)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

Судя по журналу, возникает проблема, когда метод onSizedChanged () вызывается в классе CanvasView, который представляет собой холст в макете фрагмента.

Метод в классе CanvasView выглядит следующим образом:

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);

    mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
    mCanvas = new Canvas(mBitmap);
}

А добавление CanvasView во фрагмент выглядит следующим образом:

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


    <com.amaj.notetakertest.CanvasView
        android:id = "@+id/signature_canvas"
        android:layout_width = "match_parent"
        android:layout_height = "match_parent"
        />

</RelativeLayout>

Не могли бы вы также опубликовать свой журнал?

Mohammad Zarei 02.05.2018 17:17

Пожалуйста, опубликуйте свой журнал сбоев из logcat.

Reaz Murshed 02.05.2018 17:30

Ах, мои извинения. Я только что сделал.

Aryaman 02.05.2018 17:35

Попробуйте создать LinearLayout после вашего RelativeLayout и используйте на нем метод add() из FragmentManager, вместо того, чтобы использовать его на вашем RelativeLayout. (Подводя итог, добавьте свой фрагмент в отдельный LinearLayout)

Nofix 02.05.2018 17:49
1
4
153
1

Ответы 1

Идея

Родительский макет ↓

<RelativeLayout>

Затем вы добавляете панель инструментов ↓

    <include layout = "@layout/toolbar_layout"/>

Затем ScrollView ↓

                     <ScrollView/>

И наконец, необходимый макет страницы ↓

                                 <RelativeLayout/>

Извините, но я не понимаю, какое значение имеет панель инструментов здесь.

Aryaman 11.05.2018 02:41

Я добавил его, чтобы помочь вам лучше понять, хотите ли вы включить его в будущем, если мой ответ помог вам, отметьте его как единое целое

user9025311 11.05.2018 06:18

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