Не удается динамически добавить фрагмент, если он внутри ScrollView? - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь динамически добавить фрагмент в свой макет 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>

Я пытаюсь динамически добавить еще один фрагмент (назовите его фрагмент2) в 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-код запускается, когда происходит событие click.

Просто для пояснения, класс TopSectionFragment расширяется android.support.v4.app.Fragment, и все в этом классе в порядке. Я могу отлично добавить фрагмент в другие макеты. Просто всякий раз, когда я пытаюсь добавить его в макет, который внутри 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>

1 Ответ

0 голосов
/ 02 мая 2018

Идея

Родительский макет & darr;

<RelativeLayout>

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

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

Тогда ScrollView & darr;

                     <ScrollView/>

И последняя требуемая страница макета & darr;

                                 <RelativeLayout/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...