Я пытаюсь динамически добавить фрагмент в свой 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>
Пожалуйста, опубликуйте свой журнал сбоев из logcat.
Ах, мои извинения. Я только что сделал.
Попробуйте создать LinearLayout
после вашего RelativeLayout
и используйте на нем метод add()
из FragmentManager, вместо того, чтобы использовать его на вашем RelativeLayout
. (Подводя итог, добавьте свой фрагмент в отдельный LinearLayout)
Идея
Родительский макет ↓
<RelativeLayout>
Затем вы добавляете панель инструментов ↓
<include layout = "@layout/toolbar_layout"/>
Затем ScrollView ↓
<ScrollView/>
И наконец, необходимый макет страницы ↓
<RelativeLayout/>
Извините, но я не понимаю, какое значение имеет панель инструментов здесь.
Я добавил его, чтобы помочь вам лучше понять, хотите ли вы включить его в будущем, если мой ответ помог вам, отметьте его как единое целое
Не могли бы вы также опубликовать свой журнал?