前提
以下のような UI を持つ Android アプリケーションを作成しています。
Header: ツールバー、タブ。CoordinatorLayout で管理され、上スクロール時にツールバーが畳まれるように実装しています。
Body: Scroll 可能な RecyclerView を持つ Fragment がセットされた ViewPager
Footer: EditText (行数制限ナシ)
下スクロール時 | 上スクロール時 |
---|---|
実現したいこと
- この構成で、EditText で改行が行われた場合にも問題なく拡大可能にしたい。
発生している問題・エラーメッセージ
- 改行により、EditText が Header 辺りまで拡大された際に ANR が発生する。
2020-09-13 00:03:01.811 1161-1177/? E/ActivityManager: ANR in com.example.scrollingbehaviorwithedittext (com.example.scrollingbehaviorwithedittext/.MainActivity) PID: 3622 Reason: Input dispatching timed out (Waiting to send non-key event because the touched window has not finished processing certain input events that were delivered to it over 500.0ms ago. waitqueue length = 4, head.seq = 82170, Wait queue head age: 8935.3ms.) Load: 35.9 / 35.38 / 35.32 CPU usage from 14292ms to 0ms ago (2020-09-13 00:02:44.561 to 2020-09-13 00:02:58.854): 105% 3622/com.example.scrollingbehaviorwithedittext: 104% user + 1.4% kernel / faults: 29089 minor 17% 1161/system_server: 11% user + 5.8% kernel / faults: 9055 minor 161 major 2.7% 18435/com.google.android.gms.persistent: 1.6% user + 1.1% kernel / faults: 1682 minor 135 major 2.3% 1436/com.android.systemui: 1.2% user + 1.1% kernel / faults: 486 minor 1 major 2.1% 30401/com.google.android.googlequicksearchbox:search: 2% user + 0% kernel / faults: 4376 minor 62 major 1.8% 27026/adbd: 0.5% user + 1.2% kernel / faults: 1134 minor 1.7% 993/hisi_rxdata: 0% user + 1.7% kernel 1.6% 596/surfaceflinger: 0.9% user + 0.7% kernel / faults: 746 minor 23 major 1.5% 403/logd: 0.9% user + 0.5% kernel / faults: 168 minor 1 major 1.4% 990/hisi_hcc: 0% user + 1.4% kernel 1.3% 1624/com.huawei.powergenie: 0.7% user + 0.5% kernel / faults: 397 minor 2 major 1.2% 223/mmc-cmdqd/0: 0% user + 1.2% kernel 1.1% 703/hiview: 0.4% user + 0.7% kernel / faults: 66 minor 26 major 1% 131/kswapd0: 0% user + 1% kernel 0.7% 279/irq/333-0-001c: 0% user + 0.7% kernel 0% 681/media.extractor: 0% user + 0% kernel / faults: 1785 minor 98 major 0.7% 899/oal_gpio_rx_dat: 0% user + 0.7% kernel 0.7% 1642/com.android.phone: 0.5% user + 0.1% kernel / faults: 162 minor 31 major 0.6% 27946/logcat: 0.4% user + 0.2% kernel / faults: 1723 minor 0.5% 597/powerlogd: 0.4% user + 0% kernel / faults: 115 minor 0.4% 563/android.hardware.graphics.composer@2.1-service: 0% user + 0.4% kernel / faults: 1 minor 0.4% 904/hisi_frw/0: 0% user + 0.4% kernel 0.4% 2682/kworker/u16:1: 0% user + 0.4% kernel 0.3% 588/vendor.huawei.hardware.sensors@1.0-service: 0.1% user + 0.2% kernel 0.2% 404/servicemanager: 0% user + 0.2% kernel / faults: 17 minor 0.2% 3677/kworker/u16:10: 0% user + 0.2% kernel 0.2% 3991/com.google.android.gms: 0.1% user + 0.1% kernel / faults: 414 minor 2 major 0.2% 7/rcu_preempt: 0% user + 0.2% kernel 0.2% 583/vendor.huawei.hardware.light@2.0-service: 0% user + 0.1% kernel 0.2% 1564/com.huawei.systemmanager:service: 0.2% user + 0% kernel / faults: 227 minor 1 major 0.2% 2735/kworker/u16:9: 0% user + 0.2% kernel 0.2% 3268/com.google.process.gapps: 0.1% user + 0% kernel / faults: 373 minor 0.2% 3409/kworker/u16:4: 0% user + 0.2% kernel 0.1% 1//init: 0.1% user + 0% kernel / faults: 213 minor 10 major 0.1% 202/kworker/0:1H: 0% user + 0.1% kernel 0.1% 480/zygote64: 0% user + 0.1% kernel / faults: 150 minor 0.1% 657/displayengineserver: 0% user + 0.1% kernel / faults: 84 minor 26 major 0.1% 1673/com.huawei.android.launcher: 0.1% user + 0% kernel / faults: 36 minor 0.1% 3372/kworker/u16:3: 0% user + 0.1% kernel 0% 3410/kworker/u16:6: 0% user + 0% kernel 0.1% 3484/kworker/u17:2: 0% user + 0.1% kernel 0% 20/ksoftirqd/2: 0% user + 0% kernel 0% 35/ksoftirqd/5: 0% user + 0% kernel 0% 44/migration/7: 0% user + 0% kernel 0% 45/ksoftirqd/7: 0% user + 0% kernel 0% 58/mailbox-13: 0% user + 0% kernel 0% 85/sys_heap: 0% user + 0% kernel 0% 204/cfinteractive: 0% user + 0% kernel 0% 245/hw_kstate: 0% user + 0% kernel 0% 352/kworker/4:1H: 0% user + 0% kernel 0% 405/hwservicemanager: 0% user + 0% kernel / faults: 6 minor 0% 479/netd: 0% user + 0% kernel / faults: 156 minor 35 major 0% 587/vendor.huawei.hardware.power@1.0-service: 0% user + 0% kernel / faults: 1 minor 0% 594/lmkd: 0% user + 0% kernel / faults: 12 minor 0% 654/audioserver: 0% user + 0% kernel / faults: 96 minor 33 major 0% 655/cameraserver: 0% user + 0% kernel / faults: 183 minor 97 major 0% 67
該当のソースコード
MainActivity.java
java
1public class MainActivity extends AppCompatActivity { 2 private ViewPager viewPager; 3 private Toolbar toolbar; 4 5 @Override 6 protected void onCreate(Bundle savedInstanceState) { 7 super.onCreate(savedInstanceState); 8 setContentView(R.layout.activity_main); 9 10 viewPager = findViewById(R.id.view_pager); 11 toolbar = findViewById(R.id.toolbar); 12 13 ContentsPagerAdapter adapter = new ContentsPagerAdapter(getSupportFragmentManager()); 14 viewPager.setAdapter(adapter); 15 16 setSupportActionBar(toolbar); 17 getSupportActionBar().setTitle("Title"); 18 getSupportActionBar().setElevation(0); 19 } 20}
MainFragment.java
java
1public class MainFragment extends Fragment { 2 3 private RecyclerView recyclerView; 4 5 // The higher the number of elements, the more pronounced the ANR becomes. 6 private final static int LIST_ELEM_NUM = 20000; 7 8 @Override 9 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 10 return inflater.inflate(R.layout.fragment_main, container, false); 11 } 12 13 @Override 14 public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { 15 super.onViewCreated(view, savedInstanceState); 16 17 ArrayList<String> strings = new ArrayList<>(); 18 for (int i = 0; i < LIST_ELEM_NUM; ++i) { 19 strings.add(Integer.toString(i)); 20 } 21 22 recyclerView = view.findViewById(R.id.recycler_view); 23 recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); 24 recyclerView.setAdapter(new RecyclerAdapter(getContext(), strings)); 25 } 26}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <androidx.coordinatorlayout.widget.CoordinatorLayout android:id="@+id/body" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@+id/edit_text"> <com.google.android.material.appbar.AppBarLayout android:id="@+id/app_bar" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true"> <androidx.appcompat.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" app:layout_scrollFlags="scroll|enterAlways|snap" /> <com.google.android.material.tabs.TabLayout android:id="@+id/tab_layout" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#992244"/> </com.google.android.material.appbar.AppBarLayout> <androidx.viewpager.widget.ViewPager android:id="@+id/view_pager" android:layout_width="match_parent" android:layout_height="match_parent" android:hapticFeedbackEnabled="false" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> </androidx.coordinatorlayout.widget.CoordinatorLayout> <EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:background="#666666" android:hint="EditText." android:padding="12.5dp" /> </RelativeLayout>
試したこと
試した内容から、以下が判っています。
- ViewPager (とセットした Fragment) を削除し、MainActivity に直接 RecyclerView を持たせた場合は ANR が発生しない。
・Fragment を複数持たせ横スクロール可能にしたい為、解決策にはならない。
- RecyclerView にセットするリストの要素数が少なければ少ないほど、操作不能な時間は短くなる。
・要素数が 100 程度では ANR は発生しないが、実装ではより多くの要素数を持たせたい為解決策にはならない。
- ViewPager に
app:layout_behavior="@string/appbar_scrolling_view_behavior"
を指定しない場合 ANR は発生しない。
・RecyclerView が Header に被らないようにしたい為、解決策にはならない。
- EditText を CoordinatorLayout に内包した場合 ANR は発生しない。
・Footer は固定したいが、スクロール時に EditText が隠れてしまう為解決策にならない。
- ViewPager2 への移行を試したが、以前として ANR は発生する。
補足情報(FW/ツールのバージョンなど)
- 開発環境: Android Studio 4.0.1
- 検証端末: Sony Xperia XZ3 (Android 10), Huawei Nova lite 2 (Android 8.0)
・両端末で同様の事象が起こることを確認しています。
・提示しきれなかったコードはこちらから確認下さい。開発環境によっては gradle のバージョンを下げる必要があります。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。