ã¯ã
ã¯ããã¯ã©ãã·ã¥ã¬ããŒãã¯ã°ãŒã°ã«ã¢ããªãã£ã¯ã¹ããåéãããããããã®ã¹ã¿ãã¯ãã¬ãŒã¹ãé€ããŠããã®äŸå€ã«é¢ãã詳现æ å ±ãæäŸã§ããªãããšããè©«ã³ç³ãäžããŸãããã®äŸå€ãå床衚瀺ããããšã¯ã§ããŸããã
ç°å¢ïŒ
OSïŒmacOS Sierra 10.12.6
ããŒãïŒ8.4.0
æ¯ç³žïŒ0.27.5
npmïŒ5.4.0
Android StudioïŒ3.0
ããã±ãŒãž:(å¿
èŠ=>ã€ã³ã¹ããŒã«æžã¿ïŒ
react-nativeïŒ0.51.0 => 0.51.0
åå¿ïŒ16.0.0-alpha.12 => 16.0.0-alpha.12
ã¿ãŒã²ãããã©ãããã©ãŒã ïŒAndroidïŒ7.1.1ïŒ
ã¢ãã€ã«ïŒMIX2
androidïŒ7.1.1
java.lang.NullPointerExceptionïŒ
nullãªããžã§ã¯ãåç
§ã§ä»®æ³ã¡ãœãã 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable $ ConstantState.newDrawableïŒandroid.content.res.ResourcesïŒ'ãåŒã³åºããããšããŸãã
android.graphics.drawable.DrawableContainer $ DrawableContainerState.getChildïŒDrawableContainer.java:888ïŒat
android.graphics.drawable.DrawableContainer.selectDrawableïŒDrawableContainer.java:466ïŒat
android.graphics.drawable.StateListDrawable.onStateChangeïŒStateListDrawable.java:104ïŒat
android.graphics.drawable.Drawable.setStateïŒDrawable.java:735ïŒat
android.graphics.drawable.DrawableWrapper.onStateChangeïŒDrawableWrapper.java:331ïŒat
android.graphics.drawable.Drawable.setStateïŒDrawable.java:735ïŒat
android.graphics.drawable.LayerDrawable.onStateChangeïŒLayerDrawable.java:1488ïŒat
android.graphics.drawable.Drawable.setStateïŒDrawable.java:735ïŒat
android.view.View.drawableStateChangedïŒView.java:18002ïŒat
android.widget.TextView.drawableStateChangedïŒTextView.java:4097ïŒat
android.view.View.refreshDrawableStateïŒView.java:18071ïŒat
android.view.View.setPressedïŒView.java:8543ïŒat
android.view.View.setPressedïŒView.java:8521ïŒat
android.view.View.onTouchEventïŒView.java:11218ïŒat
android.widget.TextView.onTouchEventïŒTextView.java:8467ïŒat
com.facebook.react.views.textinput.ReactEditText.onTouchEventïŒReactEditText.java:150ïŒ
åãåé¡ã«çŽé¢ããŠããŸãã
ããã§ãåã[email protected]
com.facebook.react.views.textinput.ReactEditText.onTouchEvent
ReactEditText.java - line 163
java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)' on a null object reference
Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)' on a null object reference
1
android.graphics.drawable.DrawableContainer$DrawableContainerState.getChild DrawableContainer.java:884
2
android.graphics.drawable.DrawableContainer.selectDrawable DrawableContainer.java:466
3
android.graphics.drawable.StateListDrawable.onStateChange StateListDrawable.java:104
4
android.graphics.drawable.Drawable.setState Drawable.java:736
5
android.graphics.drawable.DrawableWrapper.onStateChange DrawableWrapper.java:331
6
android.graphics.drawable.Drawable.setState Drawable.java:736
7
android.view.View.drawableStateChanged View.java:19223
8
android.widget.TextView.drawableStateChanged TextView.java:4673
9
android.view.View.refreshDrawableState View.java:19292
10
android.view.View.setPressed View.java:9135
11
android.view.View.setPressed View.java:9113
12
android.view.View.onTouchEvent View.java:12357
13
android.widget.TextView.onTouchEvent TextView.java:10095
14
com.facebook.react.views.textinput.ReactEditText.onTouchEvent ReactEditText.java:163
åãåé¡
åãåé¡ã åããã°ãã¬ãŒã¹
RN44.0ã§ãåãã§ã
+1 anotha'one
ããã±ãŒãžã£ãåèµ·åããŠãã£ãã·ã¥ãã¯ãªã¢ãã人ã¯ç§ã®ããã«åããïŒ
ç§ã«ãšã£ãŠãåãåé¡ã§ãã ç§ã¯RN0.51.0ãšreact-native-material-textfield0.12.0ã䜿çšããŠããŸãã
ç§ããã®åé¡ã«çŽé¢ããŠããŸãã å¥åŠãªããšã«ãã¹ã¿ãã¯ãã¬ãŒã¹ã«ã¯æçšãªæ
å ±ãå«ãŸããŠããªãããããšã©ãŒã远跡ããã®ãéåžžã«å°é£ã§ãã ãšã©ãŒãã©ãã«ããã®ãããããããŸããã
解決çãèŠã€ãã£ããããã§æŽæ°ããŸã
RN0.52.0ã§ãåããšã©ãŒãçºçããŸãã
ãããæçš¿ããŠãããŠããããšãïŒ 2018幎1æã«ãªãªãŒã¹ãããReactNativeã®ææ°ããŒãžã§ã³v0.53.0ã䜿çšããŠããªãããã§ãããã®åé¡ãææ°ããŒãžã§ã³ã§ãåçŸã§ããããšã確èªã§ããŸããïŒ
ãããçµäºããŸãããv0.53.0以éã§ãåé¡ã解決ããªãããšã確èªã§ããå Žåã¯ãæ°ããåé¡ãéããŠãã ããã
0.53.3ã§åãåé¡
åãåé¡
@ react-native-botåé¡ãåéããå¿ èŠããããŸã
Android8ã§åãåé¡ã«çŽé¢ããŠãã
ãã£ã¡ãäžç·ã React Native 0.53.3ãSM-T550ãAPIã¬ãã«25ïŒAndroid 7.0ïŒ
ãã®åé¡ã¯ãReact Native0.53.3-Android8.1ã§çºçããŸããã
React Native 0.53.3ãAndroid 8ãåãåé¡
åãåé¡ãreact-native0.53.0ããã³android8ããã®ãšã©ãŒãã©ã³ãã ã«è¡šç€ºãããã®ã¯å¥åŠãªåå ã§ãã ãããåçŸããããã®æ£ç¢ºãªæé ãèŠã€ãããŸããã
RN 0.54.2ãå®è¡ããŠããæ¬çªã¢ããªããããŸããããã¯ãã¢ããªã®èµ·åæã«Android8.0.0ãå®è¡ããŠããäžéšã®ãŠãŒã¶ãŒã«åœ±é¿ãäžããããã§ãã
ãã®åé¡ã解決ãããã®ã¯ãªãã§ããïŒ ç§ãã¡ã®äžã«ã¯å®çšŒåç°å¢ã§ãã®åé¡ã«çŽé¢ããŠãã人ãããããããããã±ãŒãžã£ãŒã®åèµ·åãã¯åãå ¥ããããªã解決çã§ãã
ãã®åé¡ã¯çŸåšã®ããŒãžã§ã³ã«åœ±é¿ãããããå床éãå¿ èŠããããŸãã
é¢é£ããå¯èœæ§ã®ããã¹ã¿ãã¯ãã¬ãŒã¹ã«ãçŽé¢ããŠããŸãã
Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)' on a null object reference
at android.graphics.drawable.DrawableContainer$DrawableContainerState.createAllFutures(DrawableContainer.java:875)
at android.graphics.drawable.DrawableContainer$DrawableContainerState.getOpacity(DrawableContainer.java:1158)
at android.graphics.drawable.DrawableContainer.getOpacity(DrawableContainer.java:433)
at android.graphics.drawable.InsetDrawable.getOpacity(InsetDrawable.java:258)
at android.view.View.computeOpaqueFlags(View.java:16791)
at android.view.View.setBackgroundDrawable(View.java:21710)
at android.view.View.setBackground(View.java:21603)
at android.view.View.<init>(View.java:5547)
at android.widget.TextView.<init>(TextView.java:1135)
at android.widget.EditText.<init>(EditText.java:107)
at android.widget.EditText.<init>(EditText.java:103)
at android.widget.EditText.<init>(EditText.java:99)
at android.widget.EditText.<init>(EditText.java:95)
at com.facebook.react.views.textinput.ReactEditText.<init>(ReactEditText.java:92)
at com.facebook.react.views.textinput.ReactTextInputManager.createViewInstance(ReactTextInputManager.java:94)
at com.facebook.react.views.textinput.ReactTextInputManager.createViewInstance(ReactTextInputManager.java:65)
at com.facebook.react.uimanager.ViewManager.createView(ViewManager.java:46)
at com.facebook.react.uimanager.NativeViewHierarchyManager.createView(NativeViewHierarchyManager.java:218)
at com.facebook.react.uimanager.UIViewOperationQueue$CreateViewOperation.execute(UIViewOperationQueue.java:150)
at com.facebook.react.uimanager.UIViewOperationQueue$DispatchUIFrameCallback.dispatchPendingNonBatchedOperations(UIViewOperationQueue.java:923)
at com.facebook.react.uimanager.UIViewOperationQueue$DispatchUIFrameCallback.doFrameGuarded(UIViewOperationQueue.java:895)
at com.facebook.react.uimanager.GuardedFrameCallback.doFrame(GuardedFrameCallback.java:31)
at com.facebook.react.modules.core.ReactChoreographer$ReactChoreographerDispatcher.doFrame(ReactChoreographer.java:136)
at com.facebook.react.modules.core.ChoreographerCompat$FrameCallback$1.doFrame(ChoreographerCompat.java:107)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:909)
at android.view.Choreographer.doCallbacks(Choreographer.java:723)
at android.view.Choreographer.doFrame(Choreographer.java:655)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6938)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.DrawableContainer$DrawableContainerState$ConstantStateFuture.get(android.graphics.drawable.DrawableContainer$DrawableContainerState)' on a null object reference
at android.graphics.drawable.DrawableContainer$DrawableContainerState.getChild(DrawableContainer.java:823)
at android.graphics.drawable.DrawableContainer.selectDrawable(DrawableContainer.java:452)
at android.graphics.drawable.StateListDrawable.onStateChange(StateListDrawable.java:104)
at android.graphics.drawable.Drawable.setState(Drawable.java:680)
at android.graphics.drawable.DrawableWrapper.onStateChange(DrawableWrapper.java:279)
at android.graphics.drawable.Drawable.setState(Drawable.java:680)
at android.graphics.drawable.LayerDrawable.onStateChange(LayerDrawable.java:1381)
at android.graphics.drawable.Drawable.setState(Drawable.java:680)
at android.view.View.drawableStateChanged(View.java:17003)
at android.widget.TextView.drawableStateChanged(TextView.java:3984)
at android.view.View.refreshDrawableState(View.java:17067)
at android.view.View.setPressed(View.java:7914)
at android.view.View.setPressed(View.java:7892)
at android.view.View.access$2900(View.java:708)
at android.view.View$CheckForTap.run(View.java:21187)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5451)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
@grabbouãã®åé¡ãåéã§ããŸããïŒ
ããã§åãåé¡android8.0 api 26
0.54.2ã§ãåãã§ãã
FlatListå
ã§ã¬ã³ããªã³ã°ããã<TextInput>
ã«çµã蟌ã¿ãŸããã ããã<Text>
ã«çœ®ãæãããšãåé¡ã¯è§£æ¶ãããŸãã
çŸåšå ¥æå¯èœãªææ°ããŒãžã§ã³ã§è€è£œããŠãã ããããããåéããŸãã
ãããåã@ radko93
Android 8.1 API 27
ãäŸåé¢ä¿ãïŒ{
"react"ïŒ "16.3.1"ã
"react-native"ïŒ "0.55.1"ã
"react-native-linear-gradient"ïŒ "^ 2.4.0"ã
"react-native-vector-icons"ïŒ "^ 4.6.0"ã
"react-navigation"ïŒ "^ 1.5.11"
}ã
nullãªããžã§ã¯ãåç
§ã§ä»®æ³ã¡ãœãã 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable $ ConstantState.newDrawableïŒandroid.content.res.ResourcesïŒ'ãåŒã³åºãããšããŸãã
createAllFutures
DrawableContainerã javaïŒ875
getOpacity
DrawableContainerã javaïŒ1158
getOpacity
DrawableContainerã javaïŒ433
getOpacity
InsetDrawableã javaïŒ258
computeOpaqueFlags
èŠãã javaïŒ15698
setBackgroundDrawable
èŠãã javaïŒ20502
setBackground
èŠãã javaïŒ20395
èŠãã javaïŒ5238
TextViewã javaïŒ826
EditTextã javaïŒ88
EditTextã javaïŒ84
EditTextã javaïŒ80
EditTextã javaïŒ76
setThemedContext
ReactTextInputShadowNodeã javaïŒ80
createView
UIImplementationã javaïŒ282
createView
UIManagerModuleã javaïŒ366
åŒã³åºã
Method.java
åŒã³åºã
JavaMethodWrapperã javaïŒ372
åŒã³åºã
JavaModuleWrapperã javaïŒ160
å®è¡
NativeRunnable.java
handleCallback
ãã³ãã©ã javaïŒ790
dispatchMessage
ãã³ãã©ã javaïŒ99
dispatchMessage
MessageQueueThreadHandlerã javaïŒ29
ã«ãŒã
ã«ãŒããŒã javaïŒ164
å®è¡
MessageQueueThreadImplã javaïŒ192
å®è¡
糞ã javaïŒ764
åãåé¡
package.json
ãäŸåé¢ä¿ãïŒ{
"react"ïŒ "16.3.1"ã
"react-native"ïŒ "0.55.2"ã
}ã
build.gradle
compileSdkVersion 26
buildToolsVersion "26.0.2"
minSdkVersion 16
åãåé¡ã
java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)' on a null object reference
at android.graphics.drawable.DrawableContainer$DrawableContainerState.getChild(DrawableContainer.java:888)
at android.graphics.drawable.DrawableContainer.selectDrawable(DrawableContainer.java:466)
at android.graphics.drawable.StateListDrawable.onStateChange(StateListDrawable.java:104)
at android.graphics.drawable.Drawable.setState(Drawable.java:735)
at android.graphics.drawable.DrawableWrapper.onStateChange(DrawableWrapper.java:331)
at android.graphics.drawable.Drawable.setState(Drawable.java:735)
at android.view.View.drawableStateChanged(View.java:18038)
at android.widget.TextView.drawableStateChanged(TextView.java:4108)
at android.view.View.refreshDrawableState(View.java:18107)
at android.view.View.setPressed(View.java:8536)
at android.view.View.setPressed(View.java:8514)
at android.view.View.onTouchEvent(View.java:11262)
at android.widget.TextView.onTouchEvent(TextView.java:8489)
at com.facebook.react.views.textinput.ReactEditText.onTouchEvent(ReactEditText.java:162)
at android.view.View.dispatchTouchEvent(View.java:10054)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2663)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2336)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2663)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2336)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2663)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2336)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2663)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2336)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2663)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2336)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2663)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2336)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2663)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2336)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2663)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2336)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2663)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2336)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2663)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2336)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2663)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2336)
at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:432)
at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1841)
at android.app.Activity.dispatchTouchEvent(Activity.java:3233)
at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:394)
at android.view.View.dispatchPointerEvent(View.java:10286)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4514)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4370)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3883)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3953)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3911)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4053)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3919)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4110)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3883)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3953)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3911)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3919)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3883)
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6359)
at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6333)
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6288)
at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6469)
at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:193)
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.next(MessageQueue.java:323)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:6295)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:900)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:790)
AndroidïŒ7.1.1
React-NativeïŒ0.48.3
åãåé¡ã
åãåé¡ãæ¬çªç°å¢ã§ã¯ãç§ã®ããã€ã¹ã¯HUAWEIïŒLLD-AL10ïŒ8.0.0ã§ããçŸåšãReact Native0.46.2ã䜿çšããŠããŸããããããšãããããŸãã
ææ°ããŒãžã§ã³ã®react-nativeïŒ0.55.3ïŒã䜿çšããŠãããšãã«åãåé¡ãçºçããŸãã ãã®åé¡ã¯ãåè¿°ã®ããã«FlatListã®TextInputã«é¢é£ããŠããããã§ãã Android8.0ããã³8.1ã§ãšã©ãŒãçºçããŸãã ãã®åé¡ãåé¿ããããã®åé¿çã¯ãããŸããïŒ
ãã®ãã°ãåçŸããã«ã¯ãreact-nativeinitã䜿çšããŠæ°ããReactNativeãããžã§ã¯ããäœæããApp.jsã次ã®ããã«å€æŽããŸãã
import React, { Component } from 'react';
import {
StyleSheet,
TextInput,
View
} from 'react-native';
type Props = {};
export default class App extends Component<Props> {
render() {
const inputs = Array.apply(null, Array(256)).map((_, i) => i)
return (
<View>
{inputs.map(i => <TextInput key={i} />)}
</View>
);
}
}
MacOS10.13.3ã®Android8.0.0ãæèŒããGalaxyS8ã§ãããå®è¡ããŠããŸããã
"dependencies": {
"react": "16.3.1",
"react-native": "0.55.3"
},
ãšã©ãŒãTextInputsã®æ°ã«çŽæ¥é¢ä¿ããŠããªããã©ããã¯ããããŸããããããããã®ãã°ãããªãä¿¡é Œã§ããæ¹æ³ã§åçŸã§ããå¯äžã®æ¹æ³ã§ãã 128ã®å ¥åã§ã¯ãåèµ·åã®ãã³ã«ãã®ãšã©ãŒã¯çºçããŸããã§ããããæ°åãªããŒãããåŸãçºçããŸããã 256åã®è£žã®TextInputã§ããšã©ãŒãçºçããã«ã¢ããªã±ãŒã·ã§ã³ãèµ·åã§ããªãã£ããšæããŸãã ãŸããTextInputsã®éã«èŠçŽ ãè¿œå ãããšããã®ãšã©ãŒãçºçããå¯èœæ§ãäœããªãããã«æããããããTextInputsã®æ°ã«çŽæ¥é¢ä¿ããŠããªãå¯èœæ§ãé«ãããšã«ãæ°ã¥ããŸããã çŸåšã®ã¢ããªã±ãŒã·ã§ã³ã§ãããè©ŠããŸããããéå§ç»é¢ã«æ°çŸã®TextInputãè¿œå ããŠããã®ãšã©ãŒãçºçããŸããããä»ã®èŠçŽ ã§ã©ãããããåéã®TextInputãæã€ä»ã®ãã¥ãŒã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã«ããã€ããããããåžžã«ãã®ãšã©ãŒãçºçãããšã¯éããŸããã ã
åãåé¡ããããŸãã ç§ã¯ãããAndroid8.0.0ãæèŒããHuaweiP10ã§å®è¡ããŠããŸããã
"react": "^16.2.0",
"react-native": "^0.55.0",
ã¹ã¯ãªãŒã³ã·ã§ãã
åé¡ã¯TextInputsã«ããããã§ãã ããã¯ç§ã®HuaweiP10ïŒAndroid 8.0.0ïŒã§çºçããŸãã ããã«å¯Ÿããä¿®æ£ã¯ãã§ã«ãããŸããïŒ
AndroidïŒ7.1.1
"react-native"ïŒ "0.53.3"ã
ãããæçš¿ããŠãããŠããããšãïŒ åé¡ãå€ãããŒãžã§ã³ã®ReactNativeãåç §ããŠããå¯èœæ§ãããããã§ãã ææ°ãªãªãŒã¹v0.55ã§åé¡ãåçŸã§ããŸããïŒ
è²¢ç®ããŠããã ãããããšãããããŸãã
ç§ã¯åãåé¡ã«çŽé¢ããŠããŸãã ããã¯ãTextInputã³ã³ããŒãã³ãã«é¢é£ããŠããŸãã ç»é¢ã«ã¬ã³ããªã³ã°ãããŠããåäžã®TextInputã§ããããã®ãšã©ãŒãåŒãèµ·ãããŠããŸãã åé¿çã¯ãããŸããïŒ
åå¿ãã€ãã£ãïŒ0.55
åå¿ïŒ16.3.1
ReactEditTextã³ã³ã¹ãã©ã¯ã¿ãŒãsuperããå€æŽããŸããããçºçããªãããã§ãã
ãããããunderlineColorAndroidããã³ã¡ã³ãã¢ãŠãããŸã
https://github.com/yuanboGeng/react-native/commit/36f7949f9a3e9c1f3b10df43a9f495f9f8712a1f
åå¿ãã€ãã£ãïŒ0.53.3
åå¿ïŒ16.2.0
ããã¯ããšãã¥ã¬ãŒã¿ãŒãAPIã¬ãã«21ããAPIã¬ãã«26ã«ã¢ããã°ã¬ãŒãããåŸã«çºçãå§ããŸããã
éçºäžã«çç±ããªããã®ãšã©ãŒã衚瀺ãããŸããã / buildãã©ã«ããŒãã¯ãªãŒã³ã¢ãããã run-android
å床å®è¡ããŸããã åé¡ã¯æ¶ããŸããã æ¬åœã«å€ã ã ã¯ãªãŒã³ãã«ãã§ããã解決ãããããšãé¡ã£ãŠããŸãã
ãããšåãåé¡ããããŸãã å°ããªéãã1ã€ãããŸããç§ã®å ŽåãVirtualizedListïŒFlatListã®èŠªïŒå ã«TextInputsããã¹ãããŠããŸããããã®ãªã¹ããã¹ã¯ããŒã«ãå§ãããšãã«ã®ã¿åé¡ãçºçããããã§ãåžžã«ã§ã¯ãªãæç¶çã«ããçºçããŸããã ä»ã®äººãšåæ§ã«ãããã¯å®çšŒåç°å¢ã§çºçããŠãããããããã±ãŒãžã£ãŒãåèµ·åããããšã¯ã§ããŸããã
ããã€ãã®æãäžãã«åºã¥ããŠãAndroidèªäœã®å€ãåé¡ã«é¢é£ããŠããããã§ãïŒ https ïŒ
ãããæ ¹æ¬çãªåé¡ã§ããå Žåãããã¯ãRNãããžã§ã¯ãã®compileSdkãšãµããŒãã©ã€ãã©ãªã®ããŒãžã§ã³ãã¢ããã°ã¬ãŒãããã ãã§è§£æ±ºãããŸãã ãã ãããã®LoEã¯ããããŸããã
æŽæ°ïŒãã®SOã®æçš¿ã§èª¬æãããŠããããã«ããµããããžã§ã¯ãã«ãã«ãããŒã«ãšcompileSdkã®ããé«ãããŒãžã§ã³ã䜿çšããããã«åŒ·å¶ããããšããŠããç§ã®ãããžã§ã¯ãã§ã¯ãã®åé¡ã¯è§£æ±ºããŸããã§ããã ãããã®äžäœããŒãžã§ã³ãééã£ãŠé©çšããã ããªã®ãããã«ãã»ããã¢ãããRNããã®ããã«ãµããããžã§ã¯ããšããŠæ±ã£ãŠããªãã®ãããããšãå®éã«ã¯ããã§ã®åé¡ã®æå¹ãªè§£æ±ºçã§ã¯ãªãã£ãã®ãã¯ããããŸããã
ç·šé2ïŒ ReactEditTextã¯
ç·šé3ïŒããã¯è§£æ±ºçã§ã¯ãããŸããã§ããã ãã®åé¡ããªã³ã¯ãããAOSPã®åé¡ãšåãã§ãããšç§ã¯ãã¯ã確信ããŠããŸããã
ããã¹ããã©ã®çš®é¡ã®ScrollViewã«é
眮ãããã¯åé¡ã§ã¯ãªãããã§ããVirtualizedListãšScrollViewã®äž¡æ¹ã§åçŸã§ããŸãããããã®ã¹ã¬ããã®å€ãã¯FlatListã䜿çšããŠåçŸããŸããã
ç§ã¯ãããæ¬çªç°å¢ã§æã£ãŠããŸã
ç§ããã®åé¡ã«çŽé¢ããŠããŸãã @mbretãææããããã«ã cd android ; ./gradlew clean ; cd .. ; react-native run-android
å®è¡ãããšããŸããããŸãïŒããããšãïŒïŒ
ãã°ãããã§ãããå®éã®ã¯ã©ã€ã¢ã³ãã§æ¬çªç°å¢ã«ããã¢ããªã¯ã©ãã§ããããã ïŒ|
ç³ãèš³ãããŸããã@ahanusek ãããã§åé¡ã解決ãããšã¯èšã£ãŠããŸãããéçºã§ã¯ãããããŸããã£ããšèšã£ãŠããã ãã§ãïŒä»ã®èª°ãã«ã圹ç«ã€ããšãé¡ã£ãŠããŸãïŒã
ããããéçºã®å Žåã§ããããã¯è§£æ±ºçã§ã¯ãããŸããã ãã«ããã¯ãªãŒã³ã¢ããããŠã¢ããªãåèµ·åããŸãããå ¥åããã»ãšãã©ã䜿çšããªããšããã®ãšã©ãŒãåã³çºçããå¯èœæ§ããããŸãã
@ahanusekã¯ããç§ã¯ããªãã«åæããŸãããããŠæ±ºããŠããªããšè°è«ããŠããŸããã ããã¯è§£æ±ºçã§ã¯ãããŸããããç§ã«ãšã£ãŠããããŠä»ã®ãšãããããã¯ç§ãéçºãç¶ããããšãå¯èœã«ããããã«åããŠããŸã
ãããèŠãŠãv0.55.4ïŒ
FlatListãŸãã¯VirtualizedListã«TextFieldããªãããšã¯ããªã確ãã§ããfwiwã ããã¯ãæ¬çªãã«ãã§çºçããŠããŸãã
v0.55.4
ãã®åé¡ãçºçããŠããŸãã ã¯ãããªã¹ãã§TextInput
ããŠããŸãã
åå¿0.55ã§èµ·ãããŸãã 以äž
ãã©ãããªã¹ãã®å ¥åã䜿çšããŠãreact native0.55ã§ãçºçããŸãã
ç§ã®ç·šéããã³ã¡ã³ãã衚瀺ãããªãå Žåã«åããŠãããã«å®éã®æçš¿ãäœæããŸãã
ããã¹ããã©ã®çš®é¡ã®ScrollViewã«é
眮ãããã¯åé¡ã§ã¯ãªãããã§ããVirtualizedListãšScrollViewã®äž¡æ¹ã§åçŸã§ããŸãããããã®ã¹ã¬ããã®å€ãã¯FlatListã䜿çšããŠåçŸããŸããã
ãŸãã¯ãå¥ã®èšãæ¹ãããã°ãåé¡ã¯èŠçŽãããšRN Crashes when loading a very large number of TextInputs. Usually this happens in a ScrollView (or some descended component class of one), but one person got it to happen in a plain View
åãåé¡
ç§ãåãåé¡ã«çŽé¢ããŠããŸãã
äžæè°ãªããšã«ãããã¯æšå€ãŸã§ç§ã«èµ·ããå§ããŸããã§ããããããŠç§ã¯çŸåšéçºäžã®1ã¶æ以äžã®éåãæ¹æ³ã§TextInputsãã¬ã³ããªã³ã°ããŠããŸããã
AndroidããŒãžã§ã³9
Reactã16.3.1ã
React-Native "ã0.55.2"
ã³ãŒãã§ãåæ§ã®åé¡ã«çŽé¢ããŠããŸãã
ã¯ã©ãã·ã¥ãã°ïŒ
èŽåœçãªäŸå€ïŒjava.lang.NullPointerExceptionïŒnullãªããžã§ã¯ãåç
§ã§ä»®æ³ã¡ãœãã 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable $ ConstantState.newDrawableïŒandroid.content.res.ResourcesïŒ'ãåŒã³åºãããšããŸãã
android.graphics.drawable.DrawableContainer $ DrawableContainerState.createAllFuturesïŒDrawableContainer.java:875ïŒã§
android.graphics.drawable.DrawableContainer $ DrawableContainerState.getOpacityïŒDrawableContainer.java:1158ïŒã§
android.graphics.drawable.DrawableContainer.getOpacityïŒDrawableContainer.java:433ïŒã§
android.graphics.drawable.InsetDrawable.getOpacityïŒInsetDrawable.java:258ïŒã§
android.view.View.computeOpaqueFlagsïŒView.java:16791ïŒã§
android.view.View.setBackgroundDrawableïŒView.java:21710ïŒã§
android.view.View.setBackgroundïŒView.java:21603ïŒã§
android.view.Viewã§ã
android.widget.TextViewã§ã
android.widget.EditTextã§ã
android.widget.EditTextã§ã
android.widget.EditTextã§ã
android.widget.EditTextã§ã
com.facebook.react.views.textinput.ReactEditTextã§ã
ããã§ã®åé¡ã¯äœã ãšæãããŸããïŒ
ããã€ãã®èª¿æ»ãè©Šã¿ãŸããïŒ
-çŽç²ãªAndroidã¢ããªã§1000以äžã®edittextãåäœããŸã
-ããã§ç¹å®ãããŠããããã«ãçŽ200ã®ReactTextInputã倱æããŸã
ã©ã®ããã«è§£æ±ºãŸãã¯æ©èœãããŸãããïŒ
[1] UIã¹ã¬ããã§ãæ°ããEditTextïŒcontextïŒåŒã³åºãã移åããShadowNodeéåæã枬å®ããŸãããããã®EditTextãªããžã§ã¯ããUIã¹ã¬ããã§äœæããããŸã§åŸ
æ©ããŸã-åºæ¬çã«ã·ã£ããŠããŒãã®setThemedContexté¢æ°ãšæž¬å®é¢æ°ãæžãçŽããŸãã
æ¬ ç¹ïŒãã¹ãŠã®RTIã®ã¹ã¬ããã¹ã€ãã
[2]ãã€ãã£ãã¢ãžã¥ãŒã«ã§ã¬ã€ã¢ãŠãã€ã³ãã¬ãŒã¿ã䜿çšããŠEditTextãäœæããèæ¯ã«nullãæå®ããUIã¹ã¬ããã§EditTextãäœæãããã®èæ¯æç»å¯èœãªããžã§ã¯ããshadowNodeã¬ãã«ã§ãã£ãã·ã¥ããããšã«ãããèæ¯æç»å¯èœãªããžã§ã¯ãã1åã ãäœæããŸãã ãã®ãããŒã¢ãã«ã¯ãã¬ã€ã¢ãŠãã€ã³ãã¬ãŒã¿ã䜿çšããŠäœæãããdummyEditTextsã®èæ¯ãèšå®ããŠããããŒã¢ãã«ã®å¢çç·ã®ããã£ã³ã°ãã¡ãžã£ãŒã«èæ ®ãããããã«äœ¿çšãããŸãã ãã®å Žåãã¡ãžã£ãŒã¯Drawableã®äœæã1ååŸ ã€ã ãã§æžã¿ãŸãã
ç§ã¯äž¡æ¹ããã¹ãããŸãããã1024ReactTextInputã§æ£åžžã«åäœããŸãã
泚ïŒèª¿æ»ã«åºã¥ããšãããã¯å®éã«ã¯æãæŽç·Žããã解決çã§ã¯ãªãããã§ãããæå°éã®å€æŽã§æ©èœããåé¡ã®åæã蚌æããŸãã
ææ¡ãæ¹å€ã¯å€§æè¿ã§ãïŒ
ã·ã£ããŠããŒãã³ãŒãïŒ
`ããã±ãŒãž
android.content.Contextãã€ã³ããŒãããŸãã
android.graphics.drawable.Drawableãã€ã³ããŒãããŸãã
android.os.Buildãã€ã³ããŒãããŸãã
android.text.Layoutãã€ã³ããŒãããŸãã
android.view.LayoutInflaterãã€ã³ããŒãããŸãã
android.view.ViewGroupãã€ã³ããŒãããŸãã
import android.widget.EditText;
ã€ã³ããŒãcom.facebook.infer.annotation.Assertions;
ã€ã³ããŒãcom.facebook.react.bridge.JSApplicationIllegalArgumentException;
ã€ã³ããŒãcom.facebook.react.common.annotations.VisibleForTesting;
ã€ã³ããŒãcom.facebook.react.uimanager.Spacing;
ã€ã³ããŒãcom.facebook.react.uimanager.ThemedReactContext;
ã€ã³ããŒãcom.facebook.react.uimanager.UIViewOperationQueue;
ã€ã³ããŒãcom.facebook.react.uimanager.annotations.ReactProp;
ã€ã³ããŒãcom.facebook.react.views.text.ReactBaseTextShadowNode;
ã€ã³ããŒãcom.facebook.react.views.text.ReactTextUpdate;
import com.facebook.react.views.textinput.ReactTextInputLocalData;
ã€ã³ããŒãcom.facebook.react.views.view.MeasureUtil;
ã€ã³ããŒãcom.facebook.yoga.YogaMeasureFunction;
ã€ã³ããŒãcom.facebook.yoga.YogaMeasureMode;
ã€ã³ããŒãcom.facebook.yoga.YogaMeasureOutput;
ã€ã³ããŒãcom.facebook.yoga.YogaNode;
ã€ã³ããŒã
import javax.annotation.Nullable;
//泚ïŒãã®ã¯ã©ã¹ã¯ãReactTextInputShadowNodeãæåŸ
ããã¡ã«ããºã ãšå€§å·®ãããŸããã
//ããŒãã³ã³ããã¹ãã®èšå®ãšæž¬å®ã®å®è¡
ãããªãã¯ã¯ã©ã¹ReactTextInputShadowNodeã¯ReactBaseTextShadowNodeãæ¡åŒµãYogaMeasureFunctionãå®è£
ããŸã
{{
@VisibleForTesting
public static final String PROP_TEXT = "text";
private static Drawable sDummyEditTextBackgroundDrawable = null;
private int mMostRecentEventCount = UNSET;
private <strong i="13">@Nullable</strong> EditText mDummyEditText;
private <strong i="14">@Nullable</strong> ReactTextInputLocalData mLocalData;
// Represents the {<strong i="15">@code</strong> text} property only, not possible nested content.
private <strong i="16">@Nullable</strong> String mText = null;
public ReactRichTextInputShadowNode()
{
mTextBreakStrategy = (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) ?
0 : Layout.BREAK_STRATEGY_SIMPLE;
setMeasureFunction(this);
}
<strong i="17">@Override</strong>
public void setThemedContext(final ThemedReactContext themedContext)
{
super.setThemedContext(themedContext);
// Inflating with layout using background as null because new EditText(context) call
// can cause NullPointer Exception during a race scenario of UI thread performing EditText
// creation with background at the same time
// BACKGROUND:
// ---------------
// SparseArray is not threadsafe and at the same time there is logic of gc() inside it
// SparseArray is used by DrawableContainerState and new DrawableContainerState may get
// created using the an existing constant state's drawable futures(this is SparseArray) by
// cloning
// The above is a recipe for a multi-threaded null pointer exception and it happens as below
// - Native module thread working on RTI shadow node creation and its lifecycle does a
// new EditText(reactThemedContext) which in turn results in background drawable to be
// set and finally invoking the SparseArray thread unsafe code
// - UI thread meanwhile could be used to create the display EditText of some other RTI
// at the same time leading up to the same SparseArray thread unsafe code
// - Null pointer exception happens when the gc() is invoked and simultaneously clone is
// being done for the same object giving rise to a partially gc-ed object. Something
// like an item from values array was removed and null-ed but the noOfItems flag is yet
// to be updated, so cloned object has one item less than specified in noOfItems flag
// and iteration can cause null pointer exception for the deleted index.
//
// Solution:
// ------------
// Create EditText using layout inflater on Native module while specifying null for
// background and create only once the background drawable by creating an EditText on UI
// thread and caching its background drawable at shadowNode level. In this case measure only
// needs to wait once for the Drawable creation
// Shortcomings: Ideally we would like to create the Drawable on the same Native module
// thread but not able to access android.internal stylable ids to
// approach this solution
LayoutInflater sInflater =
(LayoutInflater) themedContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
EditText editText =
(EditText) sInflater.inflate(R.layout.dummy_edit_text, null, false);
// creating the EditText theme background on UI thread async to prevent above mentioned race
// scenario
if (sDummyEditTextBackgroundDrawable == null) {
themedContext.runOnUiQueueThread(new Runnable() {
<strong i="18">@Override</strong>
public void run() {
sDummyEditTextBackgroundDrawable = new EditText(themedContext).getBackground();
}
});
}
mDummyEditText = editText;
}
<strong i="19">@Override</strong>
public long measure(YogaNode node, float width, YogaMeasureMode widthMode, float height,
YogaMeasureMode heightMode)
{
// measure() should never be called before setThemedContext()
EditText editText = Assertions.assertNotNull(mDummyEditText);
if (mLocalData == null || sDummyEditTextBackgroundDrawable == null)
{
// No local data or edit text background drawable, no intrinsic size.
return YogaMeasureOutput.make(0, 0);
}
// {<strong i="20">@code</strong> EditText} has by default a border at the bottom of its view
// called "underline". To have a native look and feel of the TextEdit
// we have to preserve it at least by default.
// The border (underline) has its padding set by the background image
// provided by the system (which vary a lot among versions and vendors
// of Android), and it cannot be changed.
// So, we have to enforce it as a default padding.
// Sharing the same background drawable is not working in measure and Edit Text features.
// Hence, cloning.
editText.setBackground(sDummyEditTextBackgroundDrawable.getConstantState().newDrawable());
setDefaultPadding(Spacing.START, editText.getPaddingStart());
setDefaultPadding(Spacing.TOP, editText.getPaddingTop());
setDefaultPadding(Spacing.END, editText.getPaddingEnd());
setDefaultPadding(Spacing.BOTTOM, editText.getPaddingBottom());
// We must measure the EditText without paddings, so we have to reset them.
editText.setPadding(0, 0, 0, 0);
// This is needed to fix an android bug since 4.4.3 which will throw an NPE in measure,
// setting the layoutParams fixes it: https://code.google.com/p/android/issues/detail?id=75877
editText.setLayoutParams(
new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
mLocalData.apply(editText);
editText.measure(
MeasureUtil.getMeasureSpec(width, widthMode),
MeasureUtil.getMeasureSpec(height, heightMode));
return YogaMeasureOutput.make(editText.getMeasuredWidth(), editText.getMeasuredHeight());
}
<strong i="21">@Override</strong>
public boolean isVirtualAnchor()
{
return true;
}
<strong i="22">@Override</strong>
public boolean isYogaLeafNode()
{
return true;
}
<strong i="23">@Override</strong>
public void setLocalData(Object data)
{
Assertions.assertCondition(data instanceof ReactTextInputLocalData);
mLocalData = (ReactTextInputLocalData) data;
// Telling to Yoga that the node should be remeasured on next layout pass.
dirty();
// Note: We should NOT mark the node updated (by calling {<strong i="24">@code</strong> markUpdated}) here
// because the state remains the same.
}
@ReactProp(name = "mostRecentEventCount")
public void setMostRecentEventCount(int mostRecentEventCount)
{
mMostRecentEventCount = mostRecentEventCount;
}
@ReactProp(name = PROP_TEXT)
public void setText(<strong i="25">@Nullable</strong> String text)
{
mText = text;
markUpdated();
}
public <strong i="26">@Nullable</strong> String getText()
{
return mText;
}
<strong i="27">@Override</strong>
public void setTextBreakStrategy(<strong i="28">@Nullable</strong> String textBreakStrategy)
{
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
{
return;
}
if (textBreakStrategy == null || "simple".equals(textBreakStrategy))
{
mTextBreakStrategy = Layout.BREAK_STRATEGY_SIMPLE;
}
else if ("highQuality".equals(textBreakStrategy))
{
mTextBreakStrategy = Layout.BREAK_STRATEGY_HIGH_QUALITY;
}
else if ("balanced".equals(textBreakStrategy))
{
mTextBreakStrategy = Layout.BREAK_STRATEGY_BALANCED;
}
else
{
throw new JSApplicationIllegalArgumentException("Invalid textBreakStrategy: " +
textBreakStrategy);
}
}
<strong i="29">@Override</strong>
public void onCollectExtraUpdates(UIViewOperationQueue uiViewOperationQueue)
{
if (mMostRecentEventCount != UNSET)
{
ReactTextUpdate reactTextUpdate =
new ReactTextUpdate(
spannedFromShadowNode(this, getText()),
mMostRecentEventCount,
mContainsImages,
getPadding(Spacing.LEFT),
getPadding(Spacing.TOP),
getPadding(Spacing.RIGHT),
getPadding(Spacing.BOTTOM),
mTextAlign,
mTextBreakStrategy);
uiViewOperationQueue.enqueueUpdateExtraData(getReactTag(), reactTextUpdate);
}
}
<strong i="30">@Override</strong>
public void setPadding(int spacingType, float padding)
{
super.setPadding(spacingType, padding);
markUpdated();
}
} `
ãããŒç·šéããã¹ãã¬ã€ã¢ãŠããã¡ã€ã«
<?xml version="1.0" encoding="utf-8"?>
<EditText
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/dummy_edit_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@null"
/>
@sayantanbugsãã®ãœãªã¥ãŒã·ã§ã³ã®ã³ãŒãã¯ãããŸããïŒ ããããšãïŒ
ç§ã®æåŸã®ã³ã¡ã³ããæŽæ°ããŠãShadowNodeã³ãŒããšãããŒã®ç·šéããã¹ããèšããŸããã®ã«äœ¿çšãããã¬ã€ã¢ãŠããå«ããŸãã
@ sayantanbugs-ããã¯çŽ æŽãããðµïžäœåã§ãïŒ ç§ãã¡ã®ãããžã§ã¯ãã§ãããè©ŠããŠãå ±åããŸãïŒ ããããšãïŒ
åãåé¡
ReactNativeïŒ0.55.4
AndroidïŒ8.0
@sayantanbugså·®å/ããããæäŸããŠããã ããŸããïŒ
åãåé¡ã ä»ã®è©³çŽ°ãªãã§Crashlyticsãä»ããŠå ±åãããããããã©ãã«ã·ã¥ãŒãã£ã³ã°ãéåžžã«å°é£ã§ãã
RN 55.3
Android 8
Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)' on a null object reference
at android.graphics.drawable.DrawableContainer$DrawableContainerState.createAllFutures(DrawableContainer.java:875)
at android.graphics.drawable.DrawableContainer$DrawableContainerState.getOpacity(DrawableContainer.java:1158)
at android.graphics.drawable.DrawableContainer.getOpacity(DrawableContainer.java:433)
at android.graphics.drawable.InsetDrawable.getOpacity(InsetDrawable.java:258)
at android.view.View.computeOpaqueFlags(View.java:16791)
at android.view.View.setBackgroundDrawable(View.java:21710)
at android.view.View.setBackground(View.java:21603)
at android.view.View.<init>(View.java:5547)
at android.widget.TextView.<init>(TextView.java:1135)
at android.widget.EditText.<init>(EditText.java:107)
at android.widget.EditText.<init>(EditText.java:103)
at android.widget.EditText.<init>(EditText.java:99)
at android.widget.EditText.<init>(EditText.java:95)
at com.facebook.react.views.textinput.ReactTextInputShadowNode.setThemedContext(ReactTextInputShadowNode.java:80)
at com.facebook.react.uimanager.UIImplementation.createView(UIImplementation.java:282)
at com.facebook.react.uimanager.UIManagerModule.createView(UIManagerModule.java:366)
at java.lang.reflect.Method.invoke(Method.java)
at com.facebook.react.bridge.JavaMethodWrapper.invoke(JavaMethodWrapper.java:372)
at com.facebook.react.bridge.JavaModuleWrapper.invoke(JavaModuleWrapper.java:160)
at com.facebook.react.bridge.queue.NativeRunnable.run(NativeRunnable.java)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage(MessageQueueThreadHandler.java:29)
at android.os.Looper.loop(Looper.java:164)
at com.facebook.react.bridge.queue.MessageQueueThreadImpl$3.run(MessageQueueThreadImpl.java:192)
at java.lang.Thread.run(Thread.java:764)
ããããæ¬çªç°å¢ã§ã¢ããªãã¯ã©ãã·ã¥ããäž»ãªåå ã§ãã ããã¯ãã€/ã©ã®ããã«èµ·ãããŸããïŒ
ããã®æ¬çªãã«ãã§ãåãã§ãã
ããã¹ããç·šéãããšãã«çºçããŸãã ããã¯ã©ã³ãã ã§ãã
åå¿ïŒ16.3.0
react- nativeïŒ0.54.4
åãåé¡ããããä¿®æ£ããæ¹æ³ã¯ïŒ
^^^ããå€ãã®äººã@sayantanbugsãœãªã¥ãŒã·ã§ã³ã§åé¡ãä¿®æ£ããããšããå¿
èŠãreact-native
ãã©ã«ããŒã§ReactTextInputShadowNode.java
ãã¡ã€ã«ãèŠã€ããŠã圌ãæäŸããã³ãŒãã亀æããã ãã§ãã ã³ã£ãããããããããŸããã
ãããè¡ã£ãŠãã1é±éåŸããšã©ãŒã2åã ãçºçããããšãå ±åã§ããŠããããã§ãã ããããä»åã¯éããŸããã react-native run-android
ãä»ããŠã¢ããªãåã€ã³ã¹ããŒã«ããããšãªããã¢ããªãåèµ·åããŠæ£åžžã«åäœãããããšãã§ããŸãããããã¯ãæåéãããã€ãã®ç»é¢ã«ã¢ã¯ã»ã¹ã§ããªããªãåã«ãæ¬åœã«èŠçã§ããããããã®TextInputsãã¬ã³ããªã³ã°ããŸããã ãšã©ãŒãåã³çºçããå Žåã¯åŒãç¶ã泚æããŸããããããŸã§ã®ãšãããã»ãŒå®å
šã«æ©èœããŠãããšæããŸãã åªãããããã°ã@ sayantanbugsïŒ
@ Friendly-Robotimoããã¯è§£æ±ºçã§ã¯ãããŸããã ããããåé¿çã§ãã ããã¯ããã¹ããããŠããªããœãªã¥ãŒã·ã§ã³ã«ããããé©çšããã ãã§ã¯ä¿®æ£ã§ããªããšèªããŠããæ¬çªã³ãŒãã§çºçããŠããŸãã
ãããéçºè ã«è¿·æãããããªãã確ãã«ãã©ãããŠãã ããããããã解決çãšããŠäœ¿ãããã«äººã ãåæ©ä»ããã®ã¯è³¢æã§ã¯ãªããšæããŸãã ããããPRã®åºç€ãšããŠã
@ Friendly-Robotã«åæããŸããïŒããã§ãã@ sayantanbugsã«æè¬ããŸãïŒã ããã«RNã®äººã¯ããŸããïŒ ããããRNãªããžããªã«å°éããŠãã¹ãã§ãããšæããŸããïŒ
ããŠãç§ã¯ã€ãã«drawableStateChanged()
ãããããé©çšããReactEditText
ç¬èªã®ã³ããŒãæäŸã§ããŸãã
<strong i="9">@Override</strong>
protected void drawableStateChanged() {
try {
super.drawableStateChanged();
} catch (Exception e) {
Timber.e("Prevented Drawable crash!");
}
}
ããã¯æåéãåãªããããã§ãããå°ãªããšãã¢ããªã±ãŒã·ã§ã³ã¯ã¯ã©ãã·ã¥ããŸããã ç§ã®ç¥ãéããããã¹ãå ¥åã¯äŸç¶ãšããŠå¿çæ§ãé«ããæåŸ ã©ããã«æ©èœããŸãã
ïŒçŸåšä¿®æ£ãããŠããïŒã¯ã©ãã·ã¥ãåçŸãããšããã®å®éã®äŸå€ãæ°åé£ç¶ããŠçºçããŠããããšãããããŸããã
ç·šéïŒ
ããŒã...ãã¹ãŠãæ©èœããŠããããã«èŠããŸãããDrawableç¶æ
ãæ°žç¶çã«ç ŽæããŠããããã§ãã æ°ããããã¹ãå
¥åã§å®å
šã«æ°ãããã¥ãŒãäœæããåŸã§ããããã¹ãå
¥åã«è§Šãããšãã¡ãã»ãŒãžãåã³è¡šç€ºãããŸãã 幞ããå
¥åãã¯ãªãã¯ãããšãã«ã®ã¿è¡šç€ºãããããã¹ããå
¥åãããšãã«ã¯è¡šç€ºãããŸããã
ä»å€ããã¥ãŒãšãã©ã³ãžã·ã§ã³ã§éãã§ããŸããããã®ãšã©ãŒã20åçºçããŸãã...äœãããŠããŸããã§ããããããã²ãŒã·ã§ã³ãã¯ãªãã¯ããŠãã¥ãŒéã®ãã©ã³ãžã·ã§ã³ããã¹ãããŸããã ããã¯å€§ããããšã ãšæããŸãïŒ/
ãœãªã¥ãŒã·ã§ã³ããã¹ãããŠããã@ Friendly-Robotã«æè¬ããŸãïŒ
ç§ã®ãœãªã¥ãŒã·ã§ã³ããããã§ãããšããã»ãšãã©ã®èŠè§£ã«åæãããœãªã¥ãŒã·ã§ã³ãå«ãå ã®æçš¿ã§ãã®ããšãè¿°ã¹ãŸããã ãããç§ã®ãããžã§ã¯ãã§ãŸã 䜿çšã§ããçç±ã¯ãRNRTIãæ¡åŒµããããæ©èœè±å¯ãªRTIãäœæããããã§ãã ãããã£ãŠãã«ã¹ã¿ã RTIã®ShadowNodeå®è£ ã§ãœãªã¥ãŒã·ã§ã³ã䜿çšã§ããŸãã å®éãç§ãã¡ã®ãããžã§ã¯ãã§ã¯ãå€ãã®RNãã°/ãŠãŒã¹ã±ãŒã¹ãä¿®æ£ããããã«RNã®ä¿®æ£ããŒãžã§ã³ãç¶æããŠããããããããã®å€æŽãããã«å ããããšãã§ããŸãã
ãã®éã«æ°æ¥ã®ãã¡ã«ç®åã®ççŒåé¡ã解決ããªããã°ãªããªãã£ãã®ã§ãç§ã¯ããã«ä»ã®å¯èœæ§ã«ã€ããŠããäžåºŠèŠçŽãã€ããã§ãã
ãã£ãŒãããã¯ãããããšãããããŸãïŒ
@davidmontemayor ãç§ã®ä¿®æ£ã§ãããŒã¢ãã«ç¶æ
ã®åé¡ã«æ°ä»ããå Žåã¯ãshadowNodeãå€æŽããŠãåžžã«æ°ããEditTextïŒïŒãå®è¡ããŸããããã®åŒã³åºããUIthreadã«ç§»åãããããŒã¢ãã«ãåŠçããªãããã«ããããšãã§ããŸãã ããã¯ééããªããããä¿®æ£ããã§ãããã ã·ã£ããŠããŒãã®æ¬åœã®ç®çãåã«èæ¯ã®å¢çç·ã®ããã£ã³ã°ãååŸããããšã§ãã£ãå Žåãã¹ã¬ãããåãæ¿ããã®ã¯éå¹ççãªæ¹æ³ã§ãããããããã¯ãããããããŸããã§ããããRNã§æ¡çšãããŠããã¡ã«ããºã ã¯ãã®ããã«åäœããŠããŸããããå¯äœçšããããŸãã
ããã«ãããã¡ãžã£ãŒé¢æ°ã䜿çšãã以å€ã«ããã®æç¹ã§äœ¿çšãããŠããæ¹æ³ã§EditTextãªããžã§ã¯ããå¿
èŠãšããªãããã«ãShadowNodeãèªåã§æžãçŽããŠããå¯èœæ§ããããšèããããŸãã
ç§ã«ãèµ·ãããŸãã ScrollViewã䜿çšããŠããŸãã
ã¹ã¯ããŒã«ãã¥ãŒã«ããŸããŸãªã³ã³ãããŒã«ïŒã©ãžãªããªã¹ãããšãã£ããããã¹ããªã©ïŒããããŸãã ç§ã¯æ倧10ã®ã³ã³ãããŒã«ãæã£ãŠãããšæãã®ã§ã巚倧ãªãªã¹ãã§ã¯ãããŸããã
ããããåçŸããã®ã¯é£ããã§ãã ã©ã³ãã ãªæéã«çºçããããã§ãããç»é¢ã«ScrollViewã衚瀺ãããŠããå ŽåïŒç·šéããã¹ãã³ã³ãããŒã«ãå«ãŸããŠããå ŽåïŒãã¢ããªãããã¯ã°ã©ãŠã³ããããã©ã¢ã°ã©ãŠã³ãã«ç§»åãããŸã§è¿œè·¡ããŠãããšæããŸãã
100ïŒ
確å®ã§ã¯ãããŸããã
ãããAndroidãµããŒãlibããŒãžã§ã³ã«é¢é£ããŠãããã©ããçåã«æããŸãã
FBã«æ¥ãŠããã®ãã°ãä¿®æ£ããŠãã ããã
ãã®ãããªã©ã³ãã ãªã¯ã©ãã·ã¥ãçºçããå Žåãæ¬çªå質ã®ã¢ããªãäœæããã®ã¯å°é£ã§ãã
com.facebook.react.views.textinput.ReactEditText
RN 0.54
Android SDK 27
é»è©±8.1
ãã®åé¡ããããScrollViewsã䜿çšããŠããŸãã @davidmontemayor ããã£ã¬ã¯ããªæ§é ã§ç·šéãããã¡ã€ã«ã«åœŒã®RN newbã転éã§ããŸããïŒ ã¯ã©ãã·ã¥ãã€ã©ã€ã©ãã圱é¿ãåãŒããŠããã¢ããªãåžå Žã«åºããŠãããä¿®æ£ãè¡ããããŸã§ãããªããšåãããã«ãšã©ãŒããã£ããããããšæã£ãŠããŸããã 䜿çšãããã¡ã€ã«ã®äŸã¯ãããŸããïŒ
åãïŒ
NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)' on a null object reference
@ Squidski-æ®å¿µãªããã EditText
åæåã®å€±æã«å¯ŸåŠãå§ãããšãã catch'emall ãã®ä¿®æ£ã¯éåžžã«ããªãããŒã«ãªããŸãã èæ¯ãšããŠããã®åé¡ãé¡åšåãã2ã€ã®ç°ãªãæ¹æ³ããããŸãã
android.widget.EditText.<init>(EditText.java:95)
ïŒandroid.widget.TextView.onTouchEvent(TextView.java:8467)
ïŒãšçžäºäœçšãããšãéèŠãªã®ã¯ã ReactTextInputShadowNode
äœæããããã¥ãŒã眮ãæããããšã§ãã new EditText(getThemedContext())
å®è¡ããã代ããã«ã EditText
ããæ¡åŒµããç¬èªã®ã¯ã©ã¹ãäœæããŸãã 次ã«ã drawableStateChanged()
ã®2çªç®ã®ãã¹ã«ãã£ãŠåŒãèµ·ããããäŸå€ããã£ããã§ããŸãã
é£ããã®ã¯ãåæåãšã©ãŒãä¿®æ£ããããšã§ãã ãã®ããã«ã¯ã EditText.setBackground()
æž¡ãããå€ããããŒã¢ãã«ãã©ããããããã«äœ¿çšã§ãããDrawableWrapperãã¯ã©ã¹ãäœæããå¿
èŠããããŸãã ãã®ã©ãããŒã¯ãããªã²ãŒãããã¹ããŒãããäŸå€ããã£ããããå¿
èŠããããŸãã
ãã®åé¡ã¯ã2018幎7æ25æ¥ã®æç¹ã§ãææ°ããŒãžã§ã³ã®React Native +ææ°ã®JSC +ææ°ã®gradleã䜿çšããŠããã¢ããªã§åŒãç¶ãã©ã³ãã ã«çºçããŸã
React Native Environment Info:
System:
OS: macOS High Sierra 10.13.3
CPU: x64 Intel(R) Core(TM) i5-5250U CPU @ 1.60GHz
Memory: 26.19 MB / 8.00 GB
Shell: 5.3 - /bin/zsh
SDKs:
iOS SDK:
Platforms: iOS 11.4, macOS 10.13, tvOS 11.4, watchOS 4.3
IDEs:
Android Studio: 3.1 AI-173.4720617
Xcode: 9.4.1/9F2000 - /usr/bin/xcodebuild
npmPackages:
react: ^16.4.1 => 16.4.1
react-native: ^0.56.0 => 0.56.0
npmGlobalPackages:
react-native-cli: 2.0.1
JSC: org.webkit:android-jsc:r224109
Gradle: 4.8.1
ãã®åé¡ã¯ãAndroid8.0.0ããã³RN0.55.3ã§çºçãå§ããŸããã ãããŸãã¯PRã®åé¿çã¯ãããŸããïŒ
TextInputsã®FlatListã§ãåãåé¡ãã©ã³ãã ã«çºçããŸãð
java.lang.NullPointerExceptionMainActivity
java.lang.NullPointerException Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)' on a null object reference
DrawableContainer.java:875 android.graphics.drawable.DrawableContainer$DrawableContainerState.createAllFutures
DrawableContainer.java:1158 android.graphics.drawable.DrawableContainer$DrawableContainerState.getOpacity
DrawableContainer.java:433 android.graphics.drawable.DrawableContainer.getOpacity
InsetDrawable.java:258 android.graphics.drawable.InsetDrawable.getOpacity
View.java:15842 android.view.View.computeOpaqueFlags
View.java:20658 android.view.View.setBackgroundDrawable
View.java:20551 android.view.View.setBackground
View.java:5290 android.view.View.<init>
TextView.java:832 android.widget.TextView.<init>
EditText.java:88 android.widget.EditText.<init>
EditText.java:84 android.widget.EditText.<init>
EditText.java:80 android.widget.EditText.<init>
EditText.java:76 android.widget.EditText.<init>
ReactTextInputShadowNode.java:80 com.facebook.react.views.textinput.ReactTextInputShadowNode.setThemedContext
UIImplementation.java:282 com.facebook.react.uimanager.UIImplementation.createView
UIManagerModule.java:366 com.facebook.react.uimanager.UIManagerModule.createView
Method.java:-2 java.lang.reflect.Method.invoke
JavaMethodWrapper.java:372 com.facebook.react.bridge.JavaMethodWrapper.invoke
JavaModuleWrapper.java:160 com.facebook.react.bridge.JavaModuleWrapper.invoke
NativeRunnable.java:-2 com.facebook.react.bridge.queue.NativeRunnable.run
Handler.java:790 android.os.Handler.handleCallback
Handler.java:99 android.os.Handler.dispatchMessage
MessageQueueThreadHandler.java:29 com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage
Looper.java:164 android.os.Looper.loop
MessageQueueThreadImpl.java:192 com.facebook.react.bridge.queue.MessageQueueThreadImpl$3.run
Thread.java:764 java.lang.Thread.run
èªæžãšãããã°ã«åºã¥ããŠãç§ã¯ä»é±æ«ã«æ¬¡ã®ããšãè©Šãããšã«ããŸãã...
ã³ãŒããããã¹ãŠã®underlineColorAndroidåŒã³åºããåé€ããŸãïŒreact-native-elements 0.19ã䜿çšããŠããŸãïŒ
Androidã®ã¹ã¿ã€ã«ã次ã®ããã«æŽæ°ããŸãã ããã«ããããã¹ãŠã®EditTextã³ã³ãããŒã«ã®èæ¯ãéæã«ãªããŸã
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="android:editTextStyle">@style/AppEditTextStyle</item>
<item name="editTextStyle">@style/AppEditTextStyle</item> <!-- For compatibility with the support library -->
</style>
<style name="AppEditTextStyle" parent="@style/Widget.AppCompat.EditText">
<item name="android:background"><strong i="15">@android</strong>:color/transparent</item>
</style>
</resources>
ãã¹ã-ãã¹ã-ãã¹ãã åé¡ã®åçŸã¯å°é£ã§ãã ã¯ã©ã€ã¢ã³ãã¯ä»æããã«ã€ãŸããããã
ãã©ãŒã«ããã¯ãšããŠã@ sayantanbugsããã®ä¿®æ£ãå®è£
ããŸã
4.1react-native-elementsã1.0xxããŒã¿ã«æŽæ°
èªã¿
https://issuetracker.google.com/issues/37068452
https://github.com/facebook/react-native/issues/18214
RN 0.54
React-native-elements 0.19
RN 0.56.0 Android8.1.0ã§çºçããŸã
ãããåé²ãããèšç»ããããã©ããçåã«æããŸãã
ã®ãã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ã眮ãæããŠã¿ãŠãã ããunderlineColorAndroid={"transparent"}
ãšunderlineColorAndroid={"#00000000"}
ãã®åé¡ãçºçããŠããŸãã ããªãããŒãªäœãã§ããã解決ããŸãã çŸåšã®å ¥åã®ã¬ã³ããªã³ã°ãåŠçãããã¿ã³ãäœæããŸãã ã€ãŸãããã¿ã³ã®FlatListããããçŸåšç·šéããŠããã®ã¯TextInputã ãã§ãã åç §ããªãå Žåãç·šéå ¥åãéå§ããã«ã¯ããã«ã¯ãªãã¯ããå¿ èŠããããŸã
handleShowInput(key) {
const { inputKeyToShow } = this.state;
if (!inputKeyToShow) {
this.setState({
inputKeyToShow: key,
}, () => this.textInput.focus());
} else {
this.setState({
inputKeyToShow: null,
});
}
}
{inputKeyToShow !== key ?
(
<TouchableOpacity
...
onPress={() => this.handleShowInput(key)}
>
<Text>{value}</Text>
</TouchableOpacity>
) :
(
<TextInput
...
ref={ref => (this.textInput = ref)}
value={value}
onEndEditing={() => this.handleShowInput(key)}
/>
)
}
@WilliamAlexander @paulroyãœãªã¥ãŒã·ã§ã³ã¯æ©èœããŸãããïŒ
@xstreamclç§ãæçš¿ãããœãªã¥ãŒã·ã§ã³ã¯ããããŸã§ã®ãšããæ©èœããŠããŸãã 2é±é以äžãåé¡ã¯çºçããŠããŸããã
ãã ããããã«ãã¹ããå¿
èŠã§ã;ïŒ
ãã®åé¡ã«ãããæ¬çªç°å¢ã§ãã¢ããªãã¯ã©ãã·ã¥ããŸããã åçŸããã®ãæ¬åœã«é£ããã®ã§ãããã¯åä»ãªãã°ã§ãã ç§ãã¡ã®ã¢ããªã®ææãªä¿®æ£ãèŠã€ããŸãããä»ã®äººã®æéãšãã©ã¹ãã¬ãŒã·ã§ã³ãç¯çŽã§ããããã«ãããã§ç§ãã¡ã®çºèŠãå ±æããããšæããŸãã
ãã®ãã°ã«ãããSamsungãGoogleãããã³LGAndroidããã€ã¹ã§ã¢ããªãã¯ã©ãã·ã¥ããŸããã 次ã®AndroidããŒãžã§ã³ããã¯ã©ãã·ã¥ã¬ããŒãããããŸãã
8.0.0
8.1.0
7.1.1
ç§ãã¡ã®ã¢ããªã¯å®è¡ãããŠããŸãïŒ
react-native
ïŒ0.53.0react
ïŒ16.2.0ä»ã®äººããã®ã¹ã¬ããã§ææããŠããããã«ããã®åé¡ã¯TextInput
ã FlatList
ãããã³ScrollView
ã³ã³ããŒãã³ãã®çµã¿åãããã¬ã³ããªã³ã°ããããšã«ãã£ãŠåŒãèµ·ããããããã§ãã ãã®äŸã§ã¯ã FlatList
äžã«ã¬ã³ããªã³ã°ãããåäžã®TextInput
ãå«ãç»é¢ããããŸãã FlatList
ã®ã¢ã€ãã ã®1ã€ãã¿ãããããšãã¢ããªã¯ãã©ãŒã ãå«ãæ°ããç»é¢ã«ç§»åããŸãã ãã®ãã©ãŒã ã®ã«ãŒãã³ã³ããŒãã³ãã¯ScrollView
ã§ãããã€ãã®TextInput
ã³ã³ããŒãã³ããå«ãŸããŠããŸãïŒããã€ãã®ãã¿ã³ããã®ä»ã®ã«ã¹ã¿ã ã³ã³ããŒãã³ããå«ãŸããŠããŸãïŒã ãŠãŒã¶ãŒããããã®FlatList
ã¢ã€ãã ã®ãããããã¿ãããããšãã¢ããªãã¯ã©ãã·ã¥ããŸãïŒæ¯åçºçããããã§ã¯ãªãããšã«æ³šæããŠãã ããïŒã
ãã®åé¡ãåçŸããããšã¯å°é£ã§ãã å®éãç§ãã¡ã¯ããããããšãã§ããŸããã§ããã ãã ããAppseeã»ãã·ã§ã³ã®èšé²ãèŠããšãã¯ãŒã¯ãããŒã®ãã®æç¹ã§ã¯ã©ãã·ã¥ãçºçããŠããããšãããããŸãã
åé¡ãåçŸã§ããªããããAppseeã®ã¯ã©ãã·ã¥ãã°ã䜿çšããŠãããã°ããå¿ èŠããããŸããã 以äžã®ã¯ã©ãã·ã¥ã¬ããŒãããã¹ã¿ãã¯ãã¬ãŒã¹ãã³ããŒããŸããïŒãããŠãããã€ãã®ãã€ãºã®å€ãã»ã¯ã·ã§ã³ãçç¥ããŸããïŒã ããã¯ãä»ã®äººããã®ã¹ã¬ããã«æçš¿ããã¹ã¿ãã¯ãã¬ãŒã¹ãšã»ãŒåãã§ãã
0 java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)' on a null object reference
1 at android.graphics.drawable.DrawableContainer$DrawableContainerState.createAllFutures(DrawableContainer.java:875)
2 at android.graphics.drawable.DrawableContainer$DrawableContainerState.getOpacity(DrawableContainer.java:1158)
3 at android.graphics.drawable.DrawableContainer.getOpacity(DrawableContainer.java:433)
4 at android.graphics.drawable.InsetDrawable.getOpacity(InsetDrawable.java:258)
5 at android.view.View.computeOpaqueFlags(View.java:16900)
6 at android.view.View.setBackgroundDrawable(View.java:21824)
7 at android.view.View.setBackground(View.java:21717)
8 at android.view.View.<init>(View.java:5577)
9 at android.widget.TextView.<init>(TextView.java:1144)
...
13 at android.widget.EditText.<init>(EditText.java:96)
14 at com.facebook.react.views.textinput.ReactEditText.<init>(ReactEditText.java:91)
15 at com.facebook.react.views.textinput.ReactTextInputManager.createViewInstance(ReactTextInputManager.java:91)
16 at com.facebook.react.views.textinput.ReactTextInputManager.createViewInstance(ReactTextInputManager.java:61)
...
35 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408)
ãã®ã¹ã¬ãããèªã¿ãæ°æéãŸãã¯èª¿æ»ãè¡ã£ãåŸã ReactTextInputManager.java
ãã¡ã€ã«ã«underlineColorAndroid
propãã³ãã©ãŒãèŠã€ãããŸããã
@ReactProp(name = "underlineColorAndroid", customType = "Color")
public void setUnderlineColor(ReactEditText view, <strong i="10">@Nullable</strong> Integer underlineColor) {
// Drawable.mutate() can sometimes crash due to an AOSP bug:
// See https://code.google.com/p/android/issues/detail?id=191754 for more info
Drawable background = view.getBackground();
Drawable drawableToMutate = background.getConstantState() != null ?
background.mutate() :
background;
if (underlineColor == null) {
drawableToMutate.clearColorFilter();
} else {
drawableToMutate.setColorFilter(underlineColor, PorterDuff.Mode.SRC_IN);
}
}
ã³ã¡ã³ãã«ãªã³ã¯ãããŠãããã°ã¬ããŒãã«ã¯ã次ã®ã¹ã¿ãã¯ãã¬ãŒã¹ãå«ãŸããŠããŸãã
java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable()' on a null object reference
at android.graphics.drawable.LayerDrawable$ChildDrawable.<init>(LayerDrawable.java:1723)
at android.graphics.drawable.LayerDrawable$LayerState.<init>(LayerDrawable.java:1792)
at android.graphics.drawable.LayerDrawable.createConstantState(LayerDrawable.java:152)
at android.graphics.drawable.LayerDrawable.mutate(LayerDrawable.java:1652)
ããã¯ãã¢ããªã§çºçããŠããã¹ã¿ãã¯ãã¬ãŒã¹ãšäžèŽããŸãã æ ¹æ¬çãªåé¡ãå®å
šã«ç解ããŠãããµããããŠããŸããããæ¬çªç°å¢ã§ã¢ããªãã¯ã©ãã·ã¥ããåå ã¯ã Drawable.mutate()
ãã°ãããªã¬ãŒãããããšãåå ã§ããå¯èœæ§ããããŸãã ããã¯ã TextInput
ã³ã³ããŒãã³ãã«underlineColorAndroid
å°éå
·ãèšå®ããããšãããšãã«çºçããŸãïŒãããã£ãŠã ReactTextInputManager.setUnderlineColor
ã¡ãœãããåŒã³åºããŸãïŒã
ç§ãã¡ã®ã¢ããªã¯ã次ã®å°éå
ዤTextInput
ãã¬ã³ããªã³ã°ããŠããŸãããããã®ãã¡ã®1ã€ã¯underlineColorAndroid="transparent"
ïŒ
<TextInput
ref={this.handleRef}
value={this.props.value}
autoCorrect={false}
autoCapitalize="none"
underlineColorAndroid="transparent"
onSubmitEditing={this.handleSubmit}
onChangeText={this.props.onChangeText}
onFocus={this.handleFocused}
onBlur={this.handleBlur}
clearButtonMode="always"
/>
ã¢ããªã®TextInput
ã³ã³ããŒãã³ãããã¢ã³ããŒã¹ã³ã¢ãåé€ããã«ã¯ããã®å°éå
·ãèšå®ããå¿
èŠããããŸããã ããããç§ãã¡ã®èª¿æ»çµæã«åºã¥ããšããã®propãã³ãã©ãŒãAndroidã®ãã°ãåŒãèµ·ãããŠããããã§ãã¢ããªããšãã©ãã¯ã©ãã·ã¥ããŠããŸããã
幞ããAndroidã®TextInput
ã³ã³ããŒãã³ãããã¢ã³ããŒã¹ã³ã¢ãåé€ããå¥ã®æ¹æ³ããããŸãã android/app/src/main/res/values/styles.xml
ãã¡ã€ã«ã«è¡ãè¿œå ã§ããŸãã
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowExitAnimation"><strong i="16">@android</strong>:anim/fade_out</item>
<item name="android:windowBackground">@drawable/splash_screen</item>
+ <item name="android:editTextBackground"><strong i="17">@android</strong>:color/transparent</item>
</style>
</resources>
ç§ã¯ãŸãã次ã®ããšã瀺åããèŠãŠãããããããç§ãã¡ã®ããã«äžç·ãåé€ããªãã£ãããšã«æ³šæããŠãã ããã
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowExitAnimation"><strong i="22">@android</strong>:anim/fade_out</item>
<item name="android:windowBackground">@drawable/splash_screen</item>
</style>
+ <!-- This did *not* work for us... -->
+ <style name="AppEditTextStyle" parent="@style/Widget.AppCompat.EditText">
+ <item name="android:background"><strong i="23">@android</strong>:color/transparent</item>
+ </style>
</resources>
ããã¯æ ¹æ¬çãªåé¡ã«å¯ŸåŠããŠããŸããã ããã¯ã TextInput
ã³ã³ããŒãã³ãã§ã®underlineColorAndroid
ããããã®äœ¿çšãåé¿ããããšãå«ãåãªãåé¿çã§ãã
ããŒã«ã«ã§åé¡ãåçŸã§ããªãã£ãããããããå®éã«æ©èœãããã©ããã¯ãŸã ã¯ã£ãããšã¯èšããŸããã ãã®å€æŽã¯ãæ°é±é以å ã«ã¢ããªã®ã¢ããããŒãã§å±éãããŸãã ãã®åŸããããããçºçãããã©ããã確èªããããã«ãã°ããåŸ ã€å¿ èŠããããŸãã 調æ»çµæãå ±åããããšæããŸãã
ãã®èç«ãããåé¡ã«åãçµãã§ãããã¹ãŠã®äººã«é 匵ã£ãŠãã ããïŒ ãããã圹ã«ç«ãŠã°å¹žãã§ãã
@Hopdingã«æè¬ã
@Hopding
ãããã©ããããããšã
ç§ãã¡ã«ãšã£ãŠããã®åé¡ãããã³Androidã®nullåç §ã§åŒã³åºãã¡ãœãããèŠã€ãããã¹ãŠã®åæ§ã®åé¡ã¯ãã¢ããªã«é©åãªã¹ã¿ã€ã«ããªãããšãåå
éèŠãªã®ã¯ãã»ãšãã©ã®react-native
ã³ã³ããŒãã³ãïŒãã¹ãŠã§ã¯ãªãã«ããŠãïŒãappcompat
ã³ã³ããŒãã³ãããæ¡åŒµãããŠãããšããããšã§ãã ããªãã¡ã ãããã£ãŠããã®ãããªã¹ã¿ã€ã«ãæã€ããšã¯å¿
é ã§ãã
At somewhere like: /android/app/src/main/res/values/styles.xml
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
</style>
</resources>
ããã¯ã appcopmat
ã³ã³ããŒãã³ããæåããã¬ã³ããªã³ã°ãããªãããã view.getDrawable()
ãnullå€ãè¿ãããã setUnderlineColor
ãsetColorTint
ãããªã¡ãœãããåŒã³åºãããšãã§ããªãããã«çºçããŸãã
ãã®å Žåã react-native
ã䜿çšããŠãã€ãã£ãã©ã€ãã©ãªãäœæããåŸã§ãã€ãã£ãã¢ããªã±ãŒã·ã§ã³ã«ã€ã³ã¹ããŒã«ãããããæçµçãªã¢ããªã«ã¹ã¿ã€ã«ãååšãããã©ãããå¶åŸ¡ã§ããŸããã å°ãªããšãä»ãç§ãã¡ã¯ãã®åé¡ãèªèããŠãããããã¥ã¡ã³ããæ¹åããŸãã;ïŒ
ããã圹ã«ç«ãŠã°å¹žãïŒ
@sospedraããªãã®ã³ã¡ã³ãã¯çã«ããªã£ãŠããŸãããã³ãŒãã確èªãããšããã appcompat
ãã§ã«ç§ã®ã¹ã¿ã€ã«ã«ååšããŠããããšãããããŸããã ãããã³ã°ã®åé¿çã確èªãããšã圌ã¯ãã§ã«appcompat
ãæã£ãŠããŸãã
@Hopding
ãã®ã¹ã¿ã€ã«ã¯æ£åžžã«æ©èœããŸãã
@WilliamAlexander ãç§ã¯ããªãã®ææ¡ãæ©èœãããããšãã§ããŸããã§ããã èªåã«åã£ãã¹ã¿ã€ã«å
šäœãå«ããããšã¯ã§ããŸããïŒ
ç§ãçŽé¢ããŠãããã1ã€ã®åé¡ã¯ã @ Hopdingã®ä¿®æ£ãé©çšãããšãè€æ°è¡ã®ããã¹ãå
¥åã®ã¬ã€ã¢ãŠãã«åœ±é¿ãåºãŠãããŒããŒããããã¹ãå
¥åãéšåçã«ã«ããŒããããã«ãªãããšã§ãã ãã®äžèŠåçŽãªåé¡ã解決ããããšããŠç§ã®é«ªãåŒãè£ã
æŽæ°ïŒ @Hopdingã®ã¹ã¿ã€ã«ã¯ãã®ããã«æžãå¿ èŠããããŸã
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:editTextStyle">@style/AppEditTextStyle</item>
</style>
<style name="AppEditTextStyle" parent="@style/Widget.AppCompat.EditText">
<item name="android:background"><strong i="11">@android</strong>:color/transparent</item>
<item name="android:paddingTop">??dp</item>
<item name="android:paddingBottom">??dp</item>
</style>
ã¬ã€ã¢ãŠãã®ç Žæãä¿®æ£ããããã«ããã£ã³ã°ãè¿œå ããå¿ èŠããããŸããã
@ gavin-gmlabã
ããã«ãããŸãã
`
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<!-- Main theme colors -->
<!-- your app branding color for the app bar -->
<item name="android:colorPrimary">@color/colorPrimary</item>
<!-- darker variant for the status bar and contextual app bars -->
<item name="android:colorPrimaryDark">@color/colorPrimaryDark</item>
<!-- theme UI controls like checkboxes and text fields -->
<item name="android:colorAccent">@color/colorAccent</item>
<item name="android:editTextStyle">@style/AppEditTextStyle</item>
<item name="editTextStyle">@style/AppEditTextStyle</item> <!-- For compatibility with the support library -->
<item name="android:windowIsTranslucent">true</item>
</style>
<style name="AppEditTextStyle" parent="@style/Widget.AppCompat.EditText">
<item name="android:background"><strong i="9">@android</strong>:color/transparent</item>
</style>
`
underlineColorAndroid = "transparent"ãåé€ããŸãã
ãããŠstyle.xmlãå€æŽããŸãã
ããã¯ç§ã®ããã«åããŠããŸã
äžèšã®è§£æ±ºçã¯ã©ããç§ã«ã¯ããŸããããŸããã§ããããã©ãããã¢ããªãšããã±ãŒãžã£ãŒãéããŠåå®è¡ããŸããã
ã¢ããªããŒã¿ãã¯ãªã¢ããŠåå®è¡ããã ãã§ã
@WilliamAlexanderãš@Hopdingã®è§£æ±ºçã«æè¬ããŸãããèæ¯ãå€æŽãããšãInputTextã®ããã£ã³ã°ãåé€ãããŸãã 代ããã«ã backgroundTintã䜿çšããŸããããããã£ã³ã°ãå€æŽããªããŠãåé¡ãªãåäœããŸãã
ãã
<style name="AppEditTextStyle" parent="@style/Widget.AppCompat.EditText">
<item name="backgroundTint"><strong i="12">@android</strong>:color/transparent</item>
</style>
ãã
OKãã€ãžã§ã¯ã以å€ã®ExpoãŠãŒã¶ãŒåãã®è§£æ±ºçã¯ãããŸããïŒ
@Twishkaæ®å¿µãªãããExpokitã«ãåãåé¡ããããããçã®react-nativeã«ã€ãžã§ã¯ãããå¿ èŠããããŸãã
ã¢ããªã®ã©ãã«ãunderlineColorAndroid
èšå®ããŠããŸããããFirebaseã³ã³ãœãŒã«ã§ãã®ãã°ãååŸããŠããŸãã ãããŠãç§ã¯ãã®åé¡ãåã³åçŸããæ¹æ³ãããããŸããã
Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)' on a null object reference
at android.graphics.drawable.DrawableContainer$DrawableContainerState.createAllFutures(DrawableContainer.java:875)
at android.graphics.drawable.DrawableContainer$DrawableContainerState.getOpacity(DrawableContainer.java:1158)
at android.graphics.drawable.DrawableContainer.getOpacity(DrawableContainer.java:433)
at android.graphics.drawable.InsetDrawable.getOpacity(InsetDrawable.java:258)
at android.view.View.computeOpaqueFlags(View.java:15945)
at android.view.View.setBackgroundDrawable(View.java:20887)
at android.view.View.setBackground(View.java:20780)
at android.view.View.(View.java:5311)
at android.widget.TextView.(TextView.java:850)
at android.widget.EditText.(EditText.java:95)
at android.widget.EditText.(EditText.java:91)
at android.widget.EditText.(EditText.java:87)
at android.widget.EditText.(EditText.java:83)
at com.facebook.react.views.textinput.ReactEditText.(SourceFile:92)
at com.facebook.react.views.textinput.ReactTextInputManager.createViewInstance(SourceFile:100)
at com.facebook.react.views.textinput.ReactTextInputManager.createViewInstance(SourceFile:60)
at com.facebook.react.uimanager.ViewManager.createView(SourceFile:42)
at com.facebook.react.uimanager.NativeViewHierarchyManager.createView(SourceFile:260)
at com.facebook.react.uimanager.UIViewOperationQueue$CreateViewOperation.execute(SourceFile:200)
at com.facebook.react.uimanager.UIViewOperationQueue$DispatchUIFrameCallback.dispatchPendingNonBatchedOperations(SourceFile:1085)
at com.facebook.react.uimanager.UIViewOperationQueue$DispatchUIFrameCallback.doFrameGuarded(SourceFile:1056)
at com.facebook.react.uimanager.GuardedFrameCallback.doFrame(SourceFile:29)
at com.facebook.react.modules.core.ReactChoreographer$ReactChoreographerDispatcher.doFrame(SourceFile:134)
at com.facebook.react.modules.core.ChoreographerCompat$FrameCallback$1.doFrame(SourceFile:105)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:918)
at android.view.Choreographer.doCallbacks(Choreographer.java:732)
at android.view.Choreographer.doFrame(Choreographer.java:661)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:906)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:187)
at android.app.ActivityThread.main(ActivityThread.java:7025)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:514)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:888)
è²ã«ã€ããŠè©±ããšãplaceHolderTextColorãšborderColorã#acacac
ãªããæ€èšŒã®åé¡ãçºçãããšãã«borderColorãred
ãŸãã ãããšã¯å¥ã«ãç§ã¯underlineColorAndroid
ãèšå®ããŠããŸããã
ã©ããªå©ãã§ã倧æè¿ã§ãã
@mddanishansari rn 0.56 underlineColorAndroid
ãããã©ã«ãã§
@mddanishansari rn 0.56
underlineColorAndroid
ãããã©ã«ãã§
ã©ããããããšãã ãããªã«æ©ãè¿äºãæ¥ããšã¯æã£ãŠããŸããã§ããã åé¡ã¯ãä»ã®ãã¹ãŠã®å
ã®ãã€ãã£ãEditText
èæ¯ãéæã§ãããå¥åŠã«èŠããããšã§ãã ç§ã®ã¢ããªã®äžéšã®ç»é¢ãå
ã®ãã€ãã£ãïŒJavaïŒã§ãã
ãã®åé¡ãå®éã«ã©ã®ããã«è§£æ±ºã§ããã®ãçåã«æã£ãŠããŸããã æäŸããããœãªã¥ãŒã·ã§ã³ã¯ãåçŽãªããã¯ã§ãã æ£ããïŒ
ããã«ã¡ã¯ãã¿ããªã ãããã£ãŠãunderlineColorAndroidã䜿çšãããšããã®ã¯ã©ãã·ã¥ãäœããã®åœ¢ã§ããªã¬ãŒãããŸãã
ãããä»ã§ã¯ãããã«ãunderlineColorAndroidãããã©ã«ãã§èšå®ãããŠããŸãã
ããã䜿çšããã«ãstyles.xmlã«ãã©ãŒã«ããã¯ããã«ã¯ã©ãããã°ããã§ããïŒ
ãããã
ããã誰ããå©ããå Žåã«åããŠã ç§ã®å ŽåããborderBottomLeftRadiusãã§çºçããå®éã®è²ã®å€ã®ä»£ããã«èª€ã£ãŠNaNãéä¿¡ããŠããŸããããAndroidã ãã®iPhoneã§ã¯åé¡ã¯ãããŸããã§ããã
ãã®ã¹ã¬ããã®ãœãªã¥ãŒã·ã§ã³ã¯ç§ã«ã¯æ©èœããŠããŸããã ãã¹ãŠã®ããã¹ãå
¥åã®underlineColorAndroid
ãéééçãªãã®ã«èšå®ããå Žåã§ãïŒ '#f00'
ãã¹ãããŸããïŒããã®åé¡ãçºçããŸãã
ç§ã«ãšã£ãŠããã®åé¡ã¯äžè²«ããŠçºçããŸããã ScrollViewå ã«å€æ°ã®TextInputããããç»é¢ãè€æ°åéãããéãããããå¿ èŠããããŸãã
ãšã©ãŒã®åå ã¯éææ§ã§ã¯ãªããå€åã§ãã
åå¿ãã€ãã£ãããããããã®ãã€ãã£ãã«ã©ãŒã ããã¯ã»ãšãã©ãã¹ãŠã®äººã ãã§ã
ãã€ãã£ãã®äžç·ãå°éå
·ã§éæã«ããŸãã
æ°Žã2019幎2æ6æ¥ã«ã¯ã10æ23åPMãšã€ããªã¢ã³ãã€ã¯ã®[email protected]ã¯æžããŸããïŒ
ãã®ã¹ã¬ããã®ãœãªã¥ãŒã·ã§ã³ã¯ç§ã«ã¯æ©èœããŠããŸããã èšå®ããå Žåã§ã
éæã§ãªããã®ãžã®ãã¹ãŠã®ããã¹ãå ¥åã®underlineColorAndroid
ïŒãïŒf00ãã§ãã¹ãããŸããïŒããŸã ãã®åé¡ãçºçããŠããŸããç§ã«ãšã£ãŠããã®åé¡ã¯äžè²«ããŠçºçããŸããã ç§ã¯ããããã®TextInputsãæã£ãŠããŸã
ScrollViewå ã§ãç»é¢ãè€æ°åééããå¿ èŠããããŸã
ãããèµ·ããããã«â
ããªããã³ã¡ã³ãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/facebook/react-native/issues/17530#issuecomment-461283498 ã
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/AOG_BAlfs-GKED4gOuvtKlMD0vwEH-_zks5vK6ozgaJpZM4RaUHf
ã
ãªãã»ã©ãåãããŸããã
奜å¥å¿ãããããããããã©ã«ãå€ã®transparentãåé€ããŠã¿ãŸãã
https://github.com/facebook/react-native/commit/a3a98eb1c7fa0054a236d45421393874ce8ce558
èå³æ·±ãããšã«ããšã©ãŒã¯ãŸã çºçããŠããŸã
ç§ã¯RN58.3androidã§ãã®ãã°ãçµéšããŸããã TextInput
ã³ã³ããŒãã³ããã¬ã³ããªã³ã°ãããã³ã«ãšã©ãŒãã¹ããŒãããããšãé€ããŠãæãããªé»ãçç±ã¯ãããŸããã§ããã å°éå
·ãå€æŽãå ããã«TextInputãã¬ã³ããªã³ã°ããå Žåã§ããã¯ã©ãã·ã¥ããŸãã
Metroãåèµ·åããŠãã£ãã·ã¥ããªã»ããããããšããŸããããããŸããããŸããã§ããã å®éã«AndroidStudioãéããŠã¢ããªãåæ§ç¯ããå¿ èŠãããããã®æç¹ã§ã¢ããªãæ©èœãå§ããŸããã ããã¯ãgradleãäŸåé¢ä¿ãªã©ãé©åã«ãã³ãã«ããŠããªããšããåé¡ã§ããå¯èœæ§ããããŸããïŒ ãã®åé¡ãçºçããåã«äœãåèµ·åããã«4æééçºããŠããã®ã§ããã³ã°ã·ã§ããã®ããã«èŠããŸãããä»ã«äœãåå ã§ãããã¯æ¬åœã«èããããŸããã
ããã€ã¹ã®RN58.0ã§ãã®ãšã©ãŒãçºçããŸããã
Redmi Note 6 Pro-Android 8.1
Mi A2 Lite-Android 9
WAS-LX1A-Android 8
ã»ã³ããªãŒãèŠããšæã çŸããŸãããã圹ã«ç«ãŠã°å¹žãã§ãã
éçºè ã¯ãã®åé¡ãä¿®æ£ããŸããïŒ åé¿çã¯ç§ãã¡ã«ã¯é©ããŠããŸããïŒ
ç§ã¯ãããæ¬çªç°å¢ã§æã£ãŠããŸã
React 0.59ã§ãäžèšã®2ã€ãšåãã¹ã¿ãã¯ãã¬ãŒã¹ããããŸãã
ïŒã¹ã¿ãã¯ãã¬ãŒã¹ã®2è¡ç®ã«DrawableContainerState.createAllFutures
ããããŸãïŒ
Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)' on a null object reference
at android.graphics.drawable.DrawableContainer$DrawableContainerState.createAllFutures(DrawableContainer.java:875)
at android.graphics.drawable.DrawableContainer$DrawableContainerState.getOpacity(DrawableContainer.java:1158)
at android.graphics.drawable.DrawableContainer.getOpacity(DrawableContainer.java:433)
at android.graphics.drawable.InsetDrawable.getOpacity(InsetDrawable.java:258)
at android.view.View.computeOpaqueFlags(View.java:15718)
at android.view.View.setBackgroundDrawable(View.java:20528)
at android.view.View.setBackground(View.java:20421)
at android.view.View.<init>(View.java:5248)
at android.widget.TextView.<init>(TextView.java:826)
at android.widget.EditText.<init>(EditText.java:88)
at android.widget.EditText.<init>(EditText.java:84)
at android.widget.EditText.<init>(EditText.java:80)
at android.widget.EditText.<init>(EditText.java:76)
at com.facebook.react.views.textinput.ReactEditText.<init>(ReactEditText.java:89)
at com.facebook.react.views.textinput.ReactTextInputManager.createViewInstance(ReactTextInputManager.java:102)
at com.facebook.react.views.textinput.ReactTextInputManager.createViewInstance(ReactTextInputManager.java:62)
at com.facebook.react.uimanager.ViewManager.createView(ViewManager.java:47)
at com.facebook.react.uimanager.NativeViewHierarchyManager.createView(NativeViewHierarchyManager.java:256)
at com.facebook.react.uimanager.UIViewOperationQueue$CreateViewOperation.execute(UIViewOperationQueue.java:200)
at com.facebook.react.uimanager.UIViewOperationQueue$DispatchUIFrameCallback.dispatchPendingNonBatchedOperations(UIViewOperationQueue.java:1109)
at com.facebook.react.uimanager.UIViewOperationQueue$DispatchUIFrameCallback.doFrameGuarded(UIViewOperationQueue.java:1080)
at com.facebook.react.uimanager.GuardedFrameCallback.doFrame(GuardedFrameCallback.java:29)
at com.facebook.react.modules.core.ReactChoreographer$ReactChoreographerDispatcher.doFrame(ReactChoreographer.java:166)
at com.facebook.react.modules.core.ChoreographerCompat$FrameCallback$1.doFrame(ChoreographerCompat.java:84)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1027)
at android.view.Choreographer.doCallbacks(Choreographer.java:841)
at android.view.Choreographer.doFrame(Choreographer.java:769)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1015)
at android.os.Handler.handleCallback(Handler.java:794)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:176)
at android.app.ActivityThread.main(ActivityThread.java:6635)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)
ã»ãã®æ°æéåã«è£œåçã0.58.6ãã0.59.1ã«ã¢ããã°ã¬ãŒãããåŸãäžèšãšåãã¹ã¿ãã¯ãã¬ãŒã¹ãååŸããŸããã æ·±å»ãªåé¡ã«ãªãã®ã§ã¯ãªãããšæããŸãã
ãã®åé¡ã®è§£æ±ºçã¯ãããŸããïŒ
@sunnylqmã¯ããã©ã«ãã§èšå®ãããŠããã®ã§ã underlineColorAndroid
ãnullã«èšå®ããæ¹æ³ã¯ãããŸããïŒ
@pedrosimao @tamdao
patch-packageãªã©ã®ãã®è¡ãæåã§åé€ããå¿
èŠããããŸãã ããã§ãäžç·ãé衚瀺ã«ãããå Žåã¯ãããã€ãã®xmlconfigã§èšå®ããå¿
èŠããããŸãã
ãããã£ãŠãéèŠãªãã€ã³ãã¯ãããŒããŒãããã«ããããåœãŠãæ¹æ³ãèŠã€ãããŸã§ã not set any value to underlineColorAndroid anywhere
ããããšã§ãã
ä»æ¥ãã®ãšã©ãŒãçºçããŸãã
以åã¯åé¡ãªãåäœããŸãããããã«ãåŸã«ããã€ã¹ã§ãšã©ãŒãçºçããŸãã
ãã®åé¡ã®åé¿çã¯ãããã€ã¹ã§ã¢ããªã±ãŒã·ã§ã³ãã¢ã³ã€ã³ã¹ããŒã«ããŠãããreact-nativerun-androidã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ãåã€ã³ã¹ããŒã«ããããšã§ãã
ãã®åŸãåé¡ã¯ãªããªããŸãã
ãšããã§ãunderlineColorAndroidã®å°éå ·ã¯äœ¿çšããªãã®ã§ããã®å°éå ·ã«å€ãèšå®ãŸãã¯èšå®è§£é€ããŠãæ©èœããŸãã
ããã¯ãã¹ã¯ããŒã«ãã¥ãŒå ã§ããã€ãã®ããã¹ãå ¥åã䜿çšãããšã©ã³ãã ã«çºçããŸãã underlineColorAndroidã¯åžžã«äœ¿çšãããŸããããã¯
ä»æ¥ãäžåã§ç§ã«èµ·ãã£ãã
Expoã䜿çšããŠããå Žåã¯ãExpoãµãŒããŒãã¢ããªãããã³Expoã¢ããªãå®å šã«éããå¿ èŠããããŸãã ãããŠãããããåã³éããŸãã
ããããªããšããšã©ãŒã¯æ¶ããŸããã
Expoã§ç§ã«èµ·ãã£ãã
äœããã®çç±ã§ãããã¯ã°ã©ãŠã³ãã§ç§ã®ã¢ããªã®2ã€ã®ã€ã³ã¹ã¿ã³ã¹ããããŸããã ãæŠèŠããšåŒã°ããAndroidã®åè§ããã¿ã³ãã¯ãªãã¯ããŠã¡ã¢ãªå ã®ã¢ããªã衚瀺ãããšãã¢ããªã®ããã2ã€ã®ã€ã³ã¹ã¿ã³ã¹ã衚瀺ãããŸãããã¢ããªãéããŠå床å®è¡ãããšããã®ãšã©ãŒã¯è¡šç€ºãããªããªããŸããã
ã ãããã¿ããªãåã«èšã£ãããã«ããã¹ãŠãéããŠããäžåºŠå®è¡ããŠä¿®æ£ããå¿ èŠããããŸã
3æéãããŠãã®ãšã©ãŒãèŠã€ããããšããŠãçµæãåŸãããªãã£ãã®ã§ãAndroidãšãã¥ã¬ãŒã¿ãŒã«ã¢ããªãåã€ã³ã¹ããŒã«ãããšããšã©ãŒã¯è§£æ¶ãããŸããã
0.59.4ãè©ŠããŠããã®ã¯ã©ãã·ã¥ããŸã çºçãããã©ããã確èªããŠãã ããã
@ sunnylqm0.59.5ã§ãŸã ããã«ééããŠããŸãã
Android: 8.0.0
Android Build: R16NW
Manufacturer: samsung
Model: SM-G955F
java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)' on a null object reference
at android.graphics.drawable.DrawableContainer$DrawableContainerState.createAllFutures(DrawableContainer.java:875)
at android.graphics.drawable.DrawableContainer$DrawableContainerState.getOpacity(DrawableContainer.java:1158)
at android.graphics.drawable.DrawableContainer.getOpacity(DrawableContainer.java:433)
at android.graphics.drawable.InsetDrawable.getOpacity(InsetDrawable.java:258)
at android.view.View.computeOpaqueFlags(View.java:16791)
at android.view.View.setBackgroundDrawable(View.java:21710)
at android.view.View.setBackground(View.java:21603)
at android.view.View.<init>(View.java:5547)
at android.widget.TextView.<init>(TextView.java:1135)
at android.widget.EditText.<init>(EditText.java:107)
at android.widget.EditText.<init>(EditText.java:103)
at android.widget.EditText.<init>(EditText.java:99)
at android.widget.EditText.<init>(EditText.java:95)
at com.facebook.react.views.textinput.c.<init>
at com.facebook.react.views.textinput.ReactTextInputManager.createViewInstance
at com.facebook.react.views.textinput.ReactTextInputManager.createViewInstance
at com.facebook.react.uimanager.ViewManager.createView
at com.facebook.react.uimanager.k.a
at com.facebook.react.uimanager.aq$e.a
at com.facebook.react.uimanager.aq$h.c
at com.facebook.react.uimanager.aq$h.a
at com.facebook.react.uimanager.e.b
at com.facebook.react.modules.core.e$b.b
at com.facebook.react.modules.core.a$a$1.doFrame
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:909)
at android.view.Choreographer.doCallbacks(Choreographer.java:723)
at android.view.Choreographer.doFrame(Choreographer.java:655)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6938)
at java.lang.reflect.Method.invoke(Method.java:-2)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
è€æ°ã®TextInputãã¬ã³ããªã³ã°ããã³ã³ããŒãã³ãã§ãã®ãšã©ãŒãçºçããŸããã
ãã«ããŸãã¯ã¢ããªãåèµ·åãããšããã«ããå®è¡ããã2åç®ã«åã¬ã³ããªã³ã°ãããšå
ã«æ»ããŸãã
AndroidïŒ9
é»è©±ïŒSAMSUNGã®ã£ã©ã¯ã·ãŒããŒã9
ã¢ãã«ïŒSM-N960F / DS
react-nativeããŒãžã§ã³ã0.58.5ã
nullãªããžã§ã¯ãåç
§ã§ä»®æ³ã¡ãœãã 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable $ ConstantState.newDrawableïŒandroid.content.res.ResourcesïŒ'ãåŒã³åºãããšããŸãã
createAllFutures
DrawableContainerã javaïŒ875
getOpacity
DrawableContainerã javaïŒ1158
getOpacity
DrawableContainerã javaïŒ433
getOpacity
InsetDrawableã javaïŒ258
computeOpaqueFlags
èŠãã javaïŒ18165
setBackgroundDrawable
èŠãã javaïŒ23335
setBackground
èŠãã javaïŒ23228
èŠãã javaïŒ5952
TextViewã javaïŒ1108
EditTextã javaïŒ106
EditTextã javaïŒ102
EditTextã javaïŒ98
EditTextã javaïŒ94
setThemedContext
ReactTextInputShadowNodeã javaïŒ73
createView
UIImplementationã javaïŒ288
createView
UIManagerModuleã javaïŒ449
åŒã³åºã
Method.java
åŒã³åºã
JavaMethodWrapperã javaïŒ372
åŒã³åºã
JavaModuleWrapperã javaïŒ158
å®è¡
NativeRunnable.java
handleCallback
ãã³ãã©ã javaïŒ873
dispatchMessage
ãã³ãã©ã javaïŒ99
dispatchMessage
MessageQueueThreadHandlerã javaïŒ29
ã«ãŒã
ã«ãŒããŒã javaïŒ214
å®è¡
MessageQueueThreadImplã javaïŒ192
å®è¡
糞ã javaïŒ764
Samsung Note 8ãAndroidããŒãžã§ã³9ãReact Native0.57.0ã§ãåãåé¡ãçºçããŠããŸã
ããã§åãåé¡ã React Native0.59.0ã ã¢ããªã䜿çšãããšãåé¡ãã©ã³ãã ã«çºçããŸãã 衚瀺ããããã¿ãŒã³ãèŠã€ãããŸããã§ããã éçºã¢ãŒããšæ¬çªã¢ãŒãã®äž¡æ¹ã§çºçããŸãã
ãã®åé¡ã«ãããæ¬çªç°å¢ã§ãã¢ããªãã¯ã©ãã·ã¥ããŸããã åçŸããã®ãæ¬åœã«é£ããã®ã§ãããã¯åä»ãªãã°ã§ãã ç§ãã¡ã®ã¢ããªã®ææãªä¿®æ£ãèŠã€ããŸãããä»ã®äººã®æéãšãã©ã¹ãã¬ãŒã·ã§ã³ãç¯çŽã§ããããã«ãããã§ç§ãã¡ã®çºèŠãå ±æããããšæããŸãã
ä»æ§ãšããŒãžã§ã³
ãã®ãã°ã«ãããSamsungãGoogleãããã³LGAndroidããã€ã¹ã§ã¢ããªãã¯ã©ãã·ã¥ããŸããã 次ã®AndroidããŒãžã§ã³ããã¯ã©ãã·ã¥ã¬ããŒãããããŸãã
8.0.0
8.1.0
7.1.1
ç§ãã¡ã®ã¢ããªã¯å®è¡ãããŠããŸãïŒ
react-native
ïŒ0.53.0react
ïŒ16.2.0ã¯ã©ãã·ã¥ã®åå
ä»ã®äººããã®ã¹ã¬ããã§ææããŠããããã«ããã®åé¡ã¯
TextInput
ãFlatList
ãããã³ScrollView
ã³ã³ããŒãã³ãã®çµã¿åãããã¬ã³ããªã³ã°ããããšã«ãã£ãŠåŒãèµ·ããããããã§ãã ãã®äŸã§ã¯ãFlatList
äžã«ã¬ã³ããªã³ã°ãããåäžã®TextInput
ãå«ãç»é¢ããããŸããFlatList
ã®ã¢ã€ãã ã®1ã€ãã¿ãããããšãã¢ããªã¯ãã©ãŒã ãå«ãæ°ããç»é¢ã«ç§»åããŸãã ãã®ãã©ãŒã ã®ã«ãŒãã³ã³ããŒãã³ãã¯ScrollView
ã§ãããã€ãã®TextInput
ã³ã³ããŒãã³ããå«ãŸããŠããŸãïŒããã€ãã®ãã¿ã³ããã®ä»ã®ã«ã¹ã¿ã ã³ã³ããŒãã³ããå«ãŸããŠããŸãïŒã ãŠãŒã¶ãŒããããã®FlatList
ã¢ã€ãã ã®ãããããã¿ãããããšãã¢ããªãã¯ã©ãã·ã¥ããŸãïŒæ¯åçºçããããã§ã¯ãªãããšã«æ³šæããŠãã ããïŒããã®åé¡ãåçŸããããšã¯å°é£ã§ãã å®éãç§ãã¡ã¯ããããããšãã§ããŸããã§ããã ãã ããAppseeã»ãã·ã§ã³ã®èšé²ãèŠããšãã¯ãŒã¯ãããŒã®ãã®æç¹ã§ã¯ã©ãã·ã¥ãçºçããŠããããšãããããŸãã
åé¡ãåçŸã§ããªããããAppseeã®ã¯ã©ãã·ã¥ãã°ã䜿çšããŠãããã°ããå¿ èŠããããŸããã 以äžã®ã¯ã©ãã·ã¥ã¬ããŒãããã¹ã¿ãã¯ãã¬ãŒã¹ãã³ããŒããŸããïŒãããŠãããã€ãã®ãã€ãºã®å€ãã»ã¯ã·ã§ã³ãçç¥ããŸããïŒã ããã¯ãä»ã®äººããã®ã¹ã¬ããã«æçš¿ããã¹ã¿ãã¯ãã¬ãŒã¹ãšã»ãŒåãã§ãã
0 java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)' on a null object reference 1 at android.graphics.drawable.DrawableContainer$DrawableContainerState.createAllFutures(DrawableContainer.java:875) 2 at android.graphics.drawable.DrawableContainer$DrawableContainerState.getOpacity(DrawableContainer.java:1158) 3 at android.graphics.drawable.DrawableContainer.getOpacity(DrawableContainer.java:433) 4 at android.graphics.drawable.InsetDrawable.getOpacity(InsetDrawable.java:258) 5 at android.view.View.computeOpaqueFlags(View.java:16900) 6 at android.view.View.setBackgroundDrawable(View.java:21824) 7 at android.view.View.setBackground(View.java:21717) 8 at android.view.View.<init>(View.java:5577) 9 at android.widget.TextView.<init>(TextView.java:1144) ... 13 at android.widget.EditText.<init>(EditText.java:96) 14 at com.facebook.react.views.textinput.ReactEditText.<init>(ReactEditText.java:91) 15 at com.facebook.react.views.textinput.ReactTextInputManager.createViewInstance(ReactTextInputManager.java:91) 16 at com.facebook.react.views.textinput.ReactTextInputManager.createViewInstance(ReactTextInputManager.java:61) ... 35 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408)
åé¡ã®åå
ãã®ã¹ã¬ãããèªã¿ãæ°æéãŸãã¯èª¿æ»ãè¡ã£ãåŸã
ReactTextInputManager.java
ãã¡ã€ã«ã«underlineColorAndroid
propãã³ãã©ãŒãèŠã€ãããŸããã@ReactProp(name = "underlineColorAndroid", customType = "Color") public void setUnderlineColor(ReactEditText view, <strong i="42">@Nullable</strong> Integer underlineColor) { // Drawable.mutate() can sometimes crash due to an AOSP bug: // See https://code.google.com/p/android/issues/detail?id=191754 for more info Drawable background = view.getBackground(); Drawable drawableToMutate = background.getConstantState() != null ? background.mutate() : background; if (underlineColor == null) { drawableToMutate.clearColorFilter(); } else { drawableToMutate.setColorFilter(underlineColor, PorterDuff.Mode.SRC_IN); } }
ã³ã¡ã³ãã«ãªã³ã¯ãããŠãããã°ã¬ããŒãã«ã¯ã次ã®ã¹ã¿ãã¯ãã¬ãŒã¹ãå«ãŸããŠããŸãã
java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable()' on a null object reference at android.graphics.drawable.LayerDrawable$ChildDrawable.<init>(LayerDrawable.java:1723) at android.graphics.drawable.LayerDrawable$LayerState.<init>(LayerDrawable.java:1792) at android.graphics.drawable.LayerDrawable.createConstantState(LayerDrawable.java:152) at android.graphics.drawable.LayerDrawable.mutate(LayerDrawable.java:1652)
ããã¯ãã¢ããªã§çºçããŠããã¹ã¿ãã¯ãã¬ãŒã¹ãšäžèŽããŸãã æ ¹æ¬çãªåé¡ãå®å šã«ç解ããŠãããµããããŠããŸããããæ¬çªç°å¢ã§ã¢ããªãã¯ã©ãã·ã¥ããåå ã¯ã
Drawable.mutate()
ãã°ãããªã¬ãŒãããããšãåå ã§ããå¯èœæ§ããããŸãã ããã¯ãTextInput
ã³ã³ããŒãã³ãã«underlineColorAndroid
å°éå ·ãèšå®ããããšãããšãã«çºçããŸãïŒãããã£ãŠãReactTextInputManager.setUnderlineColor
ã¡ãœãããåŒã³åºããŸãïŒãç§ãã¡ã®ã¢ããªã¯ã次ã®å°éå ·ã§
TextInput
ãã¬ã³ããªã³ã°ããŠããŸãããããã®ãã¡ã®1ã€ã¯underlineColorAndroid="transparent"
ïŒ<TextInput ref={this.handleRef} value={this.props.value} autoCorrect={false} autoCapitalize="none" underlineColorAndroid="transparent" onSubmitEditing={this.handleSubmit} onChangeText={this.props.onChangeText} onFocus={this.handleFocused} onBlur={this.handleBlur} clearButtonMode="always" />
ä¿®æ£æ¹æ³
ã¢ããªã®
TextInput
ã³ã³ããŒãã³ãããã¢ã³ããŒã¹ã³ã¢ãåé€ããã«ã¯ããã®å°éå ·ãèšå®ããå¿ èŠããããŸããã ããããç§ãã¡ã®èª¿æ»çµæã«åºã¥ããšããã®propãã³ãã©ãŒãAndroidã®ãã°ãåŒãèµ·ãããŠããããã§ãã¢ããªããšãã©ãã¯ã©ãã·ã¥ããŠããŸããã幞ããAndroidã®
TextInput
ã³ã³ããŒãã³ãããã¢ã³ããŒã¹ã³ã¢ãåé€ããå¥ã®æ¹æ³ããããŸããandroid/app/src/main/res/values/styles.xml
ãã¡ã€ã«ã«è¡ãè¿œå ã§ããŸãã<resources> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="android:windowExitAnimation"><strong i="65">@android</strong>:anim/fade_out</item> <item name="android:windowBackground">@drawable/splash_screen</item> + <item name="android:editTextBackground"><strong i="66">@android</strong>:color/transparent</item> </style> </resources>
ç§ã¯ãŸãã次ã®ããšã瀺åããèŠãŠãããããããç§ãã¡ã®ããã«äžç·ãåé€ããªãã£ãããšã«æ³šæããŠãã ããã
<resources> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="android:windowExitAnimation"><strong i="71">@android</strong>:anim/fade_out</item> <item name="android:windowBackground">@drawable/splash_screen</item> </style> + <!-- This did *not* work for us... --> + <style name="AppEditTextStyle" parent="@style/Widget.AppCompat.EditText"> + <item name="android:background"><strong i="72">@android</strong>:color/transparent</item> + </style> </resources>
ããã¯æ ¹æ¬çãªåé¡ã«å¯ŸåŠããŠããŸããã ããã¯ã
TextInput
ã³ã³ããŒãã³ãã§ã®underlineColorAndroid
ããããã®äœ¿çšãåé¿ããããšãå«ãåãªãåé¿çã§ããããŒã«ã«ã§åé¡ãåçŸã§ããªãã£ãããããããå®éã«æ©èœãããã©ããã¯ãŸã ã¯ã£ãããšã¯èšããŸããã ãã®å€æŽã¯ãæ°é±é以å ã«ã¢ããªã®ã¢ããããŒãã§å±éãããŸãã ãã®åŸããããããçºçãããã©ããã確èªããããã«ãã°ããåŸ ã€å¿ èŠããããŸãã 調æ»çµæãå ±åããããšæããŸãã
ãã®èç«ãããåé¡ã«åãçµãã§ãããã¹ãŠã®äººã«é 匵ã£ãŠãã ããïŒ ãããã圹ã«ç«ãŠã°å¹žãã§ãã
ç§ã¯ãã®ç¶æ³ãåçŸããæ¹æ³ãç¥ã£ãŠããŸãã èšã£ãããã«ãã©ãŒã ã«æ»ã£ãŠã¯ãªãã¯ãããã©ãããªã¹ãã®é ç®ãã¯ãªãã¯ããŠãã©ãŒã ã«å ¥åããŸãã çŽ10åç¹°ãè¿ããŸãããå°ãéããããšããã®ãšã©ãŒãçºçããŸãã ç§ãèšã£ãããšã«åŸã£ãŠãšã©ãŒãåçŸããããšãã§ããŸãã
@Hopding
ç§ã¯ãã®ç¶æ³ãåçŸããæ¹æ³ãç¥ã£ãŠããŸãã èšã£ãããã«ãã©ãŒã ã«æ»ã£ãŠã¯ãªãã¯ãããã©ãããªã¹ãã®é
ç®ãã¯ãªãã¯ããŠãã©ãŒã ã«å
¥åããŸãã çŽ10åç¹°ãè¿ããŸãããå°ãéããããšããã®ãšã©ãŒãçºçããŸãã ç§ãèšã£ãããšã«åŸã£ãŠãšã©ãŒãåçŸããããšãã§ããŸãã
@Hopding
underlineColorAndroidãåé€ããŸããããåçŸããŸãã
@ react-native-botãã®åé¡ã¯éåžžã«éèŠã§ã
RN 59.5ã䜿çšããŠããŸããããã®åé¡ããããŸãã
nullãªããžã§ã¯ãåç
§ã§ä»®æ³ã¡ãœãã 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable $ ConstantState.newDrawableïŒandroid.content.res.ResourcesïŒ'ãåŒã³åºãããšããŸãã
createAllFutures
DrawableContainerã javaïŒ875
getOpacity
DrawableContainerã javaïŒ1158
getOpacity
DrawableContainerã javaïŒ433
getOpacity
InsetDrawableã javaïŒ258
computeOpaqueFlags
èŠãã javaïŒ16594
setBackgroundDrawable
èŠãã javaïŒ21577
setBackground
èŠãã javaïŒ21470
èŠãã javaïŒ5498
TextViewã javaïŒ875
EditTextã javaïŒ88
EditTextã javaïŒ84
EditTextã javaïŒ80
EditTextã javaïŒ76
setThemedContext
ReactTextInputShadowNodeã javaïŒ76
createView
UIImplementationã javaïŒ294
createView
UIManagerModuleã javaïŒ462
åŒã³åºã
Method.java
åŒã³åºã
JavaMethodWrapperã javaïŒ372
åŒã³åºã
JavaModuleWrapperã javaïŒ158
å®è¡
NativeRunnable.java
handleCallback
ãã³ãã©ã javaïŒ873
dispatchMessage
ãã³ãã©ã javaïŒ99
dispatchMessage
MessageQueueThreadHandlerã javaïŒ29
ã«ãŒã
ã«ãŒããŒã javaïŒ193
å®è¡
MessageQueueThreadImplã javaïŒ232
å®è¡
糞ã javaïŒ764
誰ãããã§ã«ããã解決ããŸãããïŒ RN 52ã§ãã®åé¡ãçºçãã56ã«ã¢ããã°ã¬ãŒãããŸããããããã§ããšã©ãŒãçºçããŸãã åçŸããæé ãè©ŠããŸããããã§ããŸããã äžéšã®ããã€ã¹ã¯ãŸã ãããã©ã³ãã ã«èµ·åããŸãã
ãã®åé¡ã§éãããã§ããïŒ
ãã®åé¡ãçºçããŸãRN0.59.5
ãã®åé¡ã«ãããæ¬çªç°å¢ã§ãã¢ããªãã¯ã©ãã·ã¥ããŸããã åçŸããã®ãæ¬åœã«é£ããã®ã§ãããã¯åä»ãªãã°ã§ãã ç§ãã¡ã®ã¢ããªã®ææãªä¿®æ£ãèŠã€ããŸãããä»ã®äººã®æéãšãã©ã¹ãã¬ãŒã·ã§ã³ãç¯çŽã§ããããã«ãããã§ç§ãã¡ã®çºèŠãå ±æããããšæããŸãã
ä»æ§ãšããŒãžã§ã³
ãã®ãã°ã«ãããSamsungãGoogleãããã³LGAndroidããã€ã¹ã§ã¢ããªãã¯ã©ãã·ã¥ããŸããã 次ã®AndroidããŒãžã§ã³ããã¯ã©ãã·ã¥ã¬ããŒãããããŸãã
8.0.0
8.1.0
7.1.1
ç§ãã¡ã®ã¢ããªã¯å®è¡ãããŠããŸãïŒ
react-native
ïŒ0.53.0react
ïŒ16.2.0ã¯ã©ãã·ã¥ã®åå
ä»ã®äººããã®ã¹ã¬ããã§ææããŠããããã«ããã®åé¡ã¯
TextInput
ãFlatList
ãããã³ScrollView
ã³ã³ããŒãã³ãã®çµã¿åãããã¬ã³ããªã³ã°ããããšã«ãã£ãŠåŒãèµ·ããããããã§ãã ãã®äŸã§ã¯ãFlatList
äžã«ã¬ã³ããªã³ã°ãããåäžã®TextInput
ãå«ãç»é¢ããããŸããFlatList
ã®ã¢ã€ãã ã®1ã€ãã¿ãããããšãã¢ããªã¯ãã©ãŒã ãå«ãæ°ããç»é¢ã«ç§»åããŸãã ãã®ãã©ãŒã ã®ã«ãŒãã³ã³ããŒãã³ãã¯ScrollView
ã§ãããã€ãã®TextInput
ã³ã³ããŒãã³ããå«ãŸããŠããŸãïŒããã€ãã®ãã¿ã³ããã®ä»ã®ã«ã¹ã¿ã ã³ã³ããŒãã³ããå«ãŸããŠããŸãïŒã ãŠãŒã¶ãŒããããã®FlatList
ã¢ã€ãã ã®ãããããã¿ãããããšãã¢ããªãã¯ã©ãã·ã¥ããŸãïŒæ¯åçºçããããã§ã¯ãªãããšã«æ³šæããŠãã ããïŒã
ãã®åé¡ãåçŸããããšã¯å°é£ã§ãã å®éãç§ãã¡ã¯ããããããšãã§ããŸããã§ããã ãã ããAppseeã»ãã·ã§ã³ã®èšé²ãèŠããšãã¯ãŒã¯ãããŒã®ãã®æç¹ã§ã¯ã©ãã·ã¥ãçºçããŠããããšãããããŸãã
åé¡ãåçŸã§ããªããããAppseeã®ã¯ã©ãã·ã¥ãã°ã䜿çšããŠãããã°ããå¿ èŠããããŸããã 以äžã®ã¯ã©ãã·ã¥ã¬ããŒãããã¹ã¿ãã¯ãã¬ãŒã¹ãã³ããŒããŸããïŒãããŠãããã€ãã®ãã€ãºã®å€ãã»ã¯ã·ã§ã³ãçç¥ããŸããïŒã ããã¯ãä»ã®äººããã®ã¹ã¬ããã«æçš¿ããã¹ã¿ãã¯ãã¬ãŒã¹ãšã»ãŒåãã§ãã0 java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)' on a null object reference 1 at android.graphics.drawable.DrawableContainer$DrawableContainerState.createAllFutures(DrawableContainer.java:875) 2 at android.graphics.drawable.DrawableContainer$DrawableContainerState.getOpacity(DrawableContainer.java:1158) 3 at android.graphics.drawable.DrawableContainer.getOpacity(DrawableContainer.java:433) 4 at android.graphics.drawable.InsetDrawable.getOpacity(InsetDrawable.java:258) 5 at android.view.View.computeOpaqueFlags(View.java:16900) 6 at android.view.View.setBackgroundDrawable(View.java:21824) 7 at android.view.View.setBackground(View.java:21717) 8 at android.view.View.<init>(View.java:5577) 9 at android.widget.TextView.<init>(TextView.java:1144) ... 13 at android.widget.EditText.<init>(EditText.java:96) 14 at com.facebook.react.views.textinput.ReactEditText.<init>(ReactEditText.java:91) 15 at com.facebook.react.views.textinput.ReactTextInputManager.createViewInstance(ReactTextInputManager.java:91) 16 at com.facebook.react.views.textinput.ReactTextInputManager.createViewInstance(ReactTextInputManager.java:61) ... 35 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408)
åé¡ã®åå
ãã®ã¹ã¬ãããèªã¿ãæ°æéãŸãã¯èª¿æ»ãè¡ã£ãåŸã
ReactTextInputManager.java
ãã¡ã€ã«ã«underlineColorAndroid
propãã³ãã©ãŒãèŠã€ãããŸããã@ReactProp(name = "underlineColorAndroid", customType = "Color") public void setUnderlineColor(ReactEditText view, <strong i="43">@Nullable</strong> Integer underlineColor) { // Drawable.mutate() can sometimes crash due to an AOSP bug: // See https://code.google.com/p/android/issues/detail?id=191754 for more info Drawable background = view.getBackground(); Drawable drawableToMutate = background.getConstantState() != null ? background.mutate() : background; if (underlineColor == null) { drawableToMutate.clearColorFilter(); } else { drawableToMutate.setColorFilter(underlineColor, PorterDuff.Mode.SRC_IN); } }
ã³ã¡ã³ãã«ãªã³ã¯ãããŠãããã°ã¬ããŒãã«ã¯ã次ã®ã¹ã¿ãã¯ãã¬ãŒã¹ãå«ãŸããŠããŸãã
java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable()' on a null object reference at android.graphics.drawable.LayerDrawable$ChildDrawable.<init>(LayerDrawable.java:1723) at android.graphics.drawable.LayerDrawable$LayerState.<init>(LayerDrawable.java:1792) at android.graphics.drawable.LayerDrawable.createConstantState(LayerDrawable.java:152) at android.graphics.drawable.LayerDrawable.mutate(LayerDrawable.java:1652)
ããã¯ãã¢ããªã§çºçããŠããã¹ã¿ãã¯ãã¬ãŒã¹ãšäžèŽããŸãã æ ¹æ¬çãªåé¡ãå®å šã«ç解ããŠãããµããããŠããŸããããæ¬çªç°å¢ã§ã¢ããªãã¯ã©ãã·ã¥ããåå ã¯ã
Drawable.mutate()
ãã°ãããªã¬ãŒãããããšãåå ã§ããå¯èœæ§ããããŸãã ããã¯ãTextInput
ã³ã³ããŒãã³ãã«underlineColorAndroid
å°éå ·ãèšå®ããããšãããšãã«çºçããŸãïŒãããã£ãŠãReactTextInputManager.setUnderlineColor
ã¡ãœãããåŒã³åºããŸãïŒã
ç§ãã¡ã®ã¢ããªã¯ã次ã®å°éå ·ã§TextInput
ãã¬ã³ããªã³ã°ããŠããŸãããããã®ãã¡ã®1ã€ã¯underlineColorAndroid="transparent"
ïŒ<TextInput ref={this.handleRef} value={this.props.value} autoCorrect={false} autoCapitalize="none" underlineColorAndroid="transparent" onSubmitEditing={this.handleSubmit} onChangeText={this.props.onChangeText} onFocus={this.handleFocused} onBlur={this.handleBlur} clearButtonMode="always" />
ä¿®æ£æ¹æ³
ã¢ããªã®
TextInput
ã³ã³ããŒãã³ãããã¢ã³ããŒã¹ã³ã¢ãåé€ããã«ã¯ããã®å°éå ·ãèšå®ããå¿ èŠããããŸããã ããããç§ãã¡ã®èª¿æ»çµæã«åºã¥ããšããã®propãã³ãã©ãŒãAndroidã®ãã°ãåŒãèµ·ãããŠããããã§ãã¢ããªããšãã©ãã¯ã©ãã·ã¥ããŠããŸããã
幞ããAndroidã®TextInput
ã³ã³ããŒãã³ãããã¢ã³ããŒã¹ã³ã¢ãåé€ããå¥ã®æ¹æ³ããããŸããandroid/app/src/main/res/values/styles.xml
ãã¡ã€ã«ã«è¡ãè¿œå ã§ããŸãã<resources> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="android:windowExitAnimation"><strong i="66">@android</strong>:anim/fade_out</item> <item name="android:windowBackground">@drawable/splash_screen</item> + <item name="android:editTextBackground"><strong i="67">@android</strong>:color/transparent</item> </style> </resources>
ç§ã¯ãŸãã次ã®ããšã瀺åããèŠãŠãããããããç§ãã¡ã®ããã«äžç·ãåé€ããªãã£ãããšã«æ³šæããŠãã ããã
<resources> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="android:windowExitAnimation"><strong i="72">@android</strong>:anim/fade_out</item> <item name="android:windowBackground">@drawable/splash_screen</item> </style> + <!-- This did *not* work for us... --> + <style name="AppEditTextStyle" parent="@style/Widget.AppCompat.EditText"> + <item name="android:background"><strong i="73">@android</strong>:color/transparent</item> + </style> </resources>
ããã¯æ ¹æ¬çãªåé¡ã«å¯ŸåŠããŠããŸããã ããã¯ã
TextInput
ã³ã³ããŒãã³ãã§ã®underlineColorAndroid
ããããã®äœ¿çšãåé¿ããããšãå«ãåãªãåé¿çã§ãã
ããŒã«ã«ã§åé¡ãåçŸã§ããªãã£ãããããããå®éã«æ©èœãããã©ããã¯ãŸã ã¯ã£ãããšã¯èšããŸããã ãã®å€æŽã¯ãæ°é±é以å ã«ã¢ããªã®ã¢ããããŒãã§å±éãããŸãã ãã®åŸããããããçºçãããã©ããã確èªããããã«ãã°ããåŸ ã€å¿ èŠããããŸãã 調æ»çµæãå ±åããããšæããŸãã
ãã®èç«ãããåé¡ã«åãçµãã§ãããã¹ãŠã®äººã«é 匵ã£ãŠãã ããïŒ ãããã圹ã«ç«ãŠã°å¹žãã§ããç§ã¯ãã®ç¶æ³ãåçŸããæ¹æ³ãç¥ã£ãŠããŸãã èšã£ãããã«ãã©ãŒã ã«æ»ã£ãŠã¯ãªãã¯ãããã©ãããªã¹ãã®é ç®ãã¯ãªãã¯ããŠãã©ãŒã ã«å ¥åããŸãã çŽ10åç¹°ãè¿ããŸãããå°ãéããããšããã®ãšã©ãŒãçºçããŸãã ç§ãèšã£ãããšã«åŸã£ãŠãšã©ãŒãåçŸããããšãã§ããŸãã
ãã®ããã«ãããä¿®æ£ããããã§ãã
åçŸããæ¹æ³ãçåã«æã人ã®ããã«ïŒç§ãã¡ã¯ã100è¿œå ããããšã«ãã£ãŠããããåçŸ<TextInput ...>
ã«Sã<ScrollView ...>
ã ãã®æç¹ã§ãæšå®75ïŒ
ã90ïŒ
ã®æåçã§ãšã©ãŒãåçŸããããšãã§ããŸããã ãœãªã¥ãŒã·ã§ã³ãè©Šãã®ã«ååã§ãã 50ãã£ãŒã«ãã§ã¯äžååã§ããã
@Hopdingã®åé¿çã¯ç§ãã¡ã®
ãã£ã¡ãäžç·ã
èŽåœçãªäŸå€ïŒjava.lang.NullPointerExceptionïŒnullãªããžã§ã¯ãåç §ã§ä»®æ³ã¡ãœãã 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable $ ConstantState.newDrawableïŒandroid.content.res.ResourcesïŒ'ãåŒã³åºãããšããŸãã
android.graphics.drawable.DrawableContainer $ DrawableContainerState.createAllFuturesïŒDrawableContainer.java:875ïŒã§
android.graphics.drawable.DrawableContainer $ DrawableContainerState.getOpacityïŒDrawableContainer.java:1158ïŒã§
android.graphics.drawable.DrawableContainer.getOpacityïŒDrawableContainer.java:433ïŒã§
android.graphics.drawable.InsetDrawable.getOpacityïŒInsetDrawable.java:258ïŒã§
android.view.View.computeOpaqueFlagsïŒView.java:18188ïŒã§
android.view.View.setBackgroundDrawableïŒView.java:23358ïŒã§
android.view.View.setBackgroundïŒView.java:23251ïŒã§
android.view.Viewã§ãïŒView.java:5948ïŒ
android.widget.TextViewã§ãïŒTextView.java:1118ïŒ
android.widget.EditTextã§ãïŒEditText.java:106ïŒ
android.widget.EditTextã§ãïŒEditText.java:102ïŒ
android.widget.EditTextã§ãïŒEditText.java:98ïŒ
android.widget.EditTextã§ãïŒEditText.java:94ïŒ
com.facebook.react.views.textinput.ReactEditTextã§ãïŒReactEditText.java:89ïŒ
com.facebook.react.views.textinput.ReactTextInputManager.createViewInstanceïŒReactTextInputManager.java:105ïŒã§
com.facebook.react.views.textinput.ReactTextInputManager.createViewInstanceïŒReactTextInputManager.java:65ïŒã§
com.facebook.react.uimanager.ViewManager.createViewïŒViewManager.java:47ïŒã§
com.facebook.react.uimanager.NativeViewHierarchyManager.createViewïŒNativeViewHierarchyManager.java:256ïŒã§
com.facebook.react.uimanager.UIViewOperationQueue $ CreateViewOperation.executeïŒUIViewOperationQueue.java:200ïŒã§
com.facebook.react.uimanager.UIViewOperationQueue $ DispatchUIFrameCallback.dispatchPendingNonBatchedOperationsïŒUIViewOperationQueue.java:1109ïŒã§
com.facebook.react.uimanager.UIViewOperationQueue $ DispatchUIFrameCallback.doFrameGuardedïŒUIViewOperationQueue.java:1080ïŒã§
com.facebook.react.uimanager.GuardedFrameCallback.doFrameïŒGuardedFrameCallback.java:29ïŒã§
com.facebook.react.modules.core.ReactChoreographer $ ReactChoreographerDispatcher.doFrameïŒReactChoreographer.java:166ïŒã§
com.facebook.react.modules.core.ChoreographerCompat $ FrameCallback $ 1.doFrameïŒChoreographerCompat.java:84ïŒã§
android.view.Choreographer $ CallbackRecord.runïŒChoreographer.java:947ïŒã§
android.view.Choreographer.doCallbacksïŒChoreographer.java:761ïŒã§
android.view.Choreographer.doFrameïŒChoreographer.java:693ïŒã§
android.view.Choreographer $ FrameDisplayEventReceiver.runïŒChoreographer.java:935ïŒã§
android.os.Handler.handleCallbackïŒHandler.java:873ïŒã§
android.os.Handler.dispatchMessageïŒHandler.java:99ïŒã§
android.os.Looper.loopïŒLooper.java:214ïŒã§
android.app.ActivityThread.mainïŒActivityThread.java:7045ïŒã§
java.lang.reflect.Method.invokeïŒMethod.javaïŒã§
com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.runïŒRuntimeInit.java:493ïŒã§
com.android.internal.os.ZygoteInit.mainïŒZygoteInit.java:965ïŒã§
åé¿çã¯ãããŸããïŒ
ãšã©ãŒãåçŸãããã³ãŒãã¯æ¬¡ã®ãšããã§ãRN0.59.8
> import React, { Component } from 'react';
> import { StyleSheet, Text, View, TextInput, FlatList, TouchableOpacity } from 'react-native';
>
> export default class App extends Component {
> state = { Valor: [] }
> componentDidMount() {
> for (i = 0; i < 90000; i++) {
> var te = { ID: i }
> this.state.Valor.push(te)
> }
> }
>
> keyExtractor = (item, index) => item.ID.toString();
> renderList = () => {
> return (
> <FlatList
> keyExtractor={this.keyExtractor}
> data={this.state.Valor}
> renderItem={({ item }) => (
> <TouchableOpacity
> activeOpacity={0.5}
> onPress={() => alert("hola")} >
> <View style={{ flex: 1 }}>
> <Text>Muestra</Text>
> <TextInput
> underlineColorAndroid={"transparent"}
> placeholder={"Ingrese"}
> keyboardType="phone-pad"
> />
> </View>
> </TouchableOpacity>
> )}
> >
> </FlatList>
> );
> };
>
> render() {
> return (
> <View style={styles.container}>
> {this.renderList()}
> </View>
> );
> }
> }
>
> const styles = StyleSheet.create({
> container: {
> flex: 1,
> justifyContent: 'flex-start',
> alignItems: 'flex-start',
> backgroundColor: '#F5FCFF',
> },
> welcome: {
> fontSize: 20,
> textAlign: 'center',
> margin: 10,
> },
> instructions: {
> textAlign: 'center',
> color: '#333333',
> marginBottom: 5,
> }
> });
>
ãããªïŒ https ïŒ
ãœãªã¥ãŒã·ã§ã³plzã
ãã®å·ã¯2018幎1æ11æ¥ã«çºè¡ãããçŸåšã¯2019幎5æã§ãããå
¬åŒããŒã ã®èª°ããããã«å¯ŸåŠããªãã®ã¯ãªãã§ããïŒ
åèãŸã§ã«ãåé¿çã¯æ©èœããŠããŸããã
ããã§ãåã0.59.6
èŽåœçãªäŸå€ïŒjava.lang.NullPointerExceptionïŒnullãªããžã§ã¯ãåç §ã§ä»®æ³ã¡ãœãã 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable $ ConstantState.newDrawableïŒandroid.content.res.ResourcesïŒ'ãåŒã³åºãããšããŸãã
android.graphics.drawable.DrawableContainer $ DrawableContainerState.createAllFuturesïŒDrawableContainer.java:875ïŒã§
android.graphics.drawable.DrawableContainer $ DrawableContainerState.getOpacityïŒDrawableContainer.java:1158ïŒã§
android.graphics.drawable.DrawableContainer.getOpacityïŒDrawableContainer.java:433ïŒã§
android.graphics.drawable.InsetDrawable.getOpacityïŒInsetDrawable.java:258ïŒã§
android.view.View.computeOpaqueFlagsïŒView.java:18188ïŒã§
android.view.View.setBackgroundDrawableïŒView.java:23358ïŒã§
android.view.View.setBackgroundïŒView.java:23251ïŒã§
android.view.ViewãïŒView.java:5948ïŒã§
android.widget.TextViewãïŒTextView.java:1118ïŒã§
android.widget.EditTextãïŒEditText.java:106ïŒã§
android.widget.EditTextãïŒEditText.java:102ïŒã§
android.widget.EditTextãïŒEditText.java:98ïŒã§
android.widget.EditTextãïŒEditText.java:94ïŒã§
com.facebook.react.views.textinput.ReactEditTextãïŒReactEditText.java:89ïŒã§
com.facebook.react.views.textinput.ReactTextInputManager.createViewInstanceïŒReactTextInputManager.java:105ïŒã§
com.facebook.react.views.textinput.ReactTextInputManager.createViewInstanceïŒReactTextInputManager.java:65ïŒã§
com.facebook.react.uimanager.ViewManager.createViewïŒViewManager.java:47ïŒã§
com.facebook.react.uimanager.NativeViewHierarchyManager.createViewïŒNativeViewHierarchyManager.java:256ïŒã§
com.facebook.react.uimanager.UIViewOperationQueue $ CreateViewOperation.executeïŒUIViewOperationQueue.java:200ïŒã§
com.facebook.react.uimanager.UIViewOperationQueue $ DispatchUIFrameCallback.dispatchPendingNonBatchedOperationsïŒUIViewOperationQueue.java:1109ïŒã§
com.facebook.react.uimanager.UIViewOperationQueue $ DispatchUIFrameCallback.doFrameGuardedïŒUIViewOperationQueue.java:1080ïŒã§
com.facebook.react.uimanager.GuardedFrameCallback.doFrameïŒGuardedFrameCallback.java:29ïŒã§
com.facebook.react.modules.core.ReactChoreographer $ ReactChoreographerDispatcher.doFrameïŒReactChoreographer.java:166ïŒã§
com.facebook.react.modules.core.ChoreographerCompat $ FrameCallback $ 1.doFrameïŒChoreographerCompat.java:84ïŒã§
android.view.Choreographer $ CallbackRecord.runïŒChoreographer.java:947ïŒã§
android.view.Choreographer.doCallbacksïŒChoreographer.java:761ïŒã§
android.view.Choreographer.doFrameïŒChoreographer.java:693ïŒã§
android.view.Choreographer $ FrameDisplayEventReceiver.runïŒChoreographer.java:935ïŒã§
android.os.Handler.handleCallbackïŒHandler.java:873ïŒã§
android.os.Handler.dispatchMessageïŒHandler.java:99ïŒã§
android.os.Looper.loopïŒLooper.java:214ïŒã§
android.app.ActivityThread.mainïŒActivityThread.java:7045ïŒã§
java.lang.reflect.Method.invokeïŒMethod.javaïŒã§
com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.runïŒRuntimeInit.java:493ïŒã§
com.android.internal.os.ZygoteInit.mainïŒZygoteInit.java:965ïŒã§
@knspatelåé¿çã¯ããã©ã³ãžã·ã§ã³å¹æã
èŠçŽãããŠãã ããïŒ
éèŠãªç¹ã¯ãã©ãã«ãunderlineColorAndroidã«å€ãèšå®ããããã©ã«ãã§patch-packageãªã©ã®ãã®è¡ãæåã§åé€ããå¿
èŠããããŸãã
ããã§ãäžç·ãé衚瀺ã«ãããå Žåã¯ãããã€ãã®xmlconfigã§èšå®ããå¿
èŠããããŸãã
ãããŠããããç§ããããŸã§ã«èŠã€ããããã€ãã®æ
å ±ã§ãïŒ
äžåœèªã®ããã°ïŒèªããªãå Žåã¯ã°ãŒã°ã«ç¿»èš³ãè©Šãããšãã§ããŸãïŒã¯ããããšéåžžã«ãã䌌ãåé¡ã«ã€ããŠèšåããŠããŸãã getConstantState
å®è£
ããŠããªãã«ã¹ã¿ã ãããŒã¢ãã«ã¯ã©ã¹ã¯ãã·ããªãªã«ãã£ãŠã¯ã¯ã©ãã·ã¥ãåŒãèµ·ããå¯èœæ§ããããšã®ããšã§ãã
textinputïŒReactEditTextïŒãåäœæãããããšãããïŒããå€ãã®textinputsãããå€ãã®å¯èœæ§ããªãµã€ã¯ã«ã®çš®é¡ïŒïŒãåã³setBackground
ãªãã httpsïŒ//github.com/aosp-mirror/ã«ç§»åããããšããããŸãã platform_frameworks_base / blob / master / graphics / java / android / graphics / drawable / DrawableContainer.javaïŒL922 ãããã§ConstantState
ã¯nullã§ãã
ç§ãèŠã€ããå¯äžã®ã«ã¹ã¿ã ãããŒã¢ãã«ã¯ã©ã¹ã¯getConstantState
ãå®è£
ããŠããŸãã
ç§ã¯ãããããã€ãã®ç©ºã®ã¯ã©ã¹ã§ãªãŒããŒã©ã€ãããããšããŸããããããŠããã¯ããã€ãã®éããçãããšãã§ããŸãïŒä»ã®ãã®ãçŸããéããã®ã¯ã©ãã·ã¥ã¯æ¶ããŸãïŒã
ããã誰ãããã£ãšæãã®ãå©ããããšãã§ããããšãé¡ã£ãŠããŸãã
æåãã¹ãã¯éåžžã«è¡ãåœããã°ã£ããã§ããããšãããã£ãã®ã§ãäžèšã§å ±åãããŠããã·ããªãªã®ããã€ããèªåçã«ãã¹ãããã³ã³ããŒãã³ããäœæããŸããã 以äžã®ã³ã³ããŒãã³ãããããŸãã ããªãã¯ããããã®ä»äºãããããã«ã©ããã«ãããã¬ã³ããªã³ã°ããå¿ èŠããããŸãã
ãããè¡ããšã@ Hopdingã«ãã£ãŠææ¡ãããŠããããã«ãstyles.xmlã®AppThemeã«ä»¥äžãè¿œå ããã ãã§ããããšãããããŸããã
<item name="android:editTextBackground"><strong i="7">@android</strong>:color/transparent</item>
ä»ã«äœãå¿
èŠãªãã underlineColorAndroid
èšå®ãåé¿ããå¿
èŠã¯ãªãã£ãã®ã§ãReactNativeãããã©ã«ãã§èšå®ããããã«ãªã£ãã®ã¯åé¡ã§ã¯ãããŸããã§ããã
ãã®ä¿®æ£ã®äž»ãªæ¬ ç¹ã¯ãçµæãšããŠããã£ã³ã°ã倱ãããããã«TextInputsã®ã¹ã¿ã€ã«ãå€æŽããå¿
èŠãããããšã§ãããŸããå®éã®äžç·ã®åäœã倱ãããŸããããã¯ãåžžã«ãééçãã«èšå®ããŠãããããã¡ãªããããããŸãã iOSãšã®äžè²«æ§ãä¿ã€ããã å¿
èŠã«å¿ããŠã onFocus
ãšonBlur
ãç£èŠããã©ãããŒã³ã³ããŒãã³ããäœæããç¬èªã®äžç·ãä»ããããšãã§ããŸãã
ReactNativeã®ç§ã®ããŒãžã§ã³ã¯0.57.3ã§ã
ãã¹ãã³ã³ããŒãã³ãã䜿çšããŠèŠã€ãããã®ä»ã®äºé ã¯æ¬¡ã®ãšããã§ãã
undefined
ã§ãã¯ã©ãã·ã¥ãçºçããŸããããRNã®ããã©ã«ãããéæãã«ãªã£ãŠãããããããããäºæ³ãããã§ããããdisplayForMs: 0
ã¯ã©ãã·ã¥ãåçŸã§ããŸãããã¹ãäžã«ã¶ãã¶ãããããªãå Žåã¯ã adb logcat
ã®åºåããã£ããã£ããŠãã³ã³ããŒãã³ãã«ãã£ãŠçæãããã³ã³ãœãŒã«ã¡ãã»ãŒãžãšã¯ã©ãã·ã¥ã¬ããŒããæ¢ãããšãã§ããŸãã
ãããç§ã®ãã¹ãã³ã³ããŒãã³ãã§ãã ãã¹ããã©ã¡ãŒã¿ã¯ãéåžž30ç§ä»¥å ã«ã¯ã©ãã·ã¥ãåŒãèµ·ããããã«èšå®ãããŠããŸãã
/**
* A test component to reproduce the crash reported at
* https://github.com/facebook/react-native/issues/17530
*/
import * as React from "react";
import { View, ScrollView, TextInput, Text, StyleSheet } from "react-native";
// These are the test parameters
const params = {
underlineColors: ["red", undefined, "transparent", "rgba(0, 0, 0, 0)"], // The colors to test
numberOfInputs: 100, // How many TextInput to render at a time
focusIntervalMs: 200, // How often to change focus between them
displayForMs: 3000, // How long to display them (set to 0 for indefinite)
delayDisplayForMs: 10, // How long to delay between displays
withScrollView: false // Whether to use a ScrollView
};
const testText = index =>
`Testing underlineColor = ${params.underlineColors[index] || "undefined"}`;
class AndroidTextInputTest extends React.Component{
state = {
underlineColorIndex: 0,
showInputs: true,
startKey: 0
};
mounted = false;
focusInterval = undefined;
textInputRefs = undefined;
focussedInputIndex = 0;
componentDidMount() {
console.log(`Testing with params = `, JSON.stringify(params));
this.mounted = true;
setTimeout(this._showInputs, params.delayDisplayForMs);
setInterval(this._focusAnInput, params.focusIntervalMs);
}
componentWillUnmount() {
clearInterval(this.focusInterval);
this.mounted = false;
}
_focusAnInput = () => {
if (this.mounted && this.textInputRefs) {
if (this.focussedInputIndex >= this.textInputRefs.length) {
this.focussedInputIndex = 0;
}
const textInputRef = this.textInputRefs[this.focussedInputIndex];
const textInput = this.refs[textInputRef];
if (textInput) {
this.focussedInputIndex++;
this.refs[textInputRef].focus();
}
}
};
_showInputs = () => {
if (this.mounted) {
console.log(testText(this.state.underlineColorIndex));
this.setState({ showInputs: true });
if (params.displayForMs) {
setTimeout(this._unshowInputs, params.displayForMs);
}
}
};
_unshowInputs = () => {
this.focussedInputIndex = 0;
this.textInputRefs = undefined;
if (this.mounted) {
let next = this.state.underlineColorIndex + 1;
if (next === params.underlineColors.length) {
next = 0;
}
this.setState({
underlineColorIndex: next,
showInputs: false,
startKey: this.state.startKey + params.numberOfInputs
});
setTimeout(this._showInputs, params.delayDisplayForMs);
}
};
render() {
const textInputs = [];
const { underlineColorIndex } = this.state;
const underlineColor = params.underlineColors[underlineColorIndex];
const refs = [];
if (this.state.showInputs) {
for (let i = 0; i < params.numberOfInputs; i++) {
const key = this.state.startKey + i + "";
refs.push(key);
textInputs.push(
<TextInput
ref={key}
key={key}
placeholder={key}
underlineColorAndroid={underlineColor}
style={styles.textInput}
/>
);
}
if (!this.textInputRefs) {
this.textInputRefs = refs;
}
}
return (
<View style={styles.mainView}>
<Text>{testText(underlineColorIndex)}</Text>
{params.withScrollView ? (
<React.Fragment>
<Text>With ScrollView</Text>
<ScrollView>{textInputs}</ScrollView>
</React.Fragment>
) : (
<React.Fragment>{textInputs}</React.Fragment>
)}
</View>
);
}
}
const styles = StyleSheet.create({
mainView: {
flex: 1,
alignItems: "center"
},
textInput: {
backgroundColor: "white",
margin: 5,
width: 300
}
});
export default AndroidTextInputTest;
解決çãæ¢ããŠãããã¹ãŠã®äººã®ããã«ãç§ã¯ãã®èšå®ã確èªããããšãã§ããŸã
åèïŒReact-Native Paperãšãã®TextInputã³ã³ããŒãã³ãã䜿çšããŠãããRN-Paper TextInputã«åœ±é¿ãäžããããšãªãã <item name="android:editTextBackground"><strong i="5">@android</strong>:color/transparent</item>
ãå®å
šã«èšå®ããããšãã§ãããã以éãã¯ã©ãã·ã¥ã¯çºçããŠããŸããã
0.59.9
ã§æ¬çªç°å¢ã§èŠãŠããŸãã
ãµã ã¹ã³ã®ã£ã©ã¯ã·ãŒS7ãšããž
Android 8.0
Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)' on a null object reference
at android.graphics.drawable.DrawableContainer$DrawableContainerState.createAllFutures + 875(DrawableContainer.java:875)
at android.graphics.drawable.DrawableContainer$DrawableContainerState.getOpacity + 1158(DrawableContainer.java:1158)
at android.graphics.drawable.DrawableContainer.getOpacity + 433(DrawableContainer.java:433)
at android.graphics.drawable.InsetDrawable.getOpacity + 258(InsetDrawable.java:258)
at android.view.View.computeOpaqueFlags + 16809(View.java:16809)
at android.view.View.setBackgroundDrawable + 21728(View.java:21728)
at android.view.View.setBackground + 21621(View.java:21621)
at android.view.View.<init> + 5553(View.java:5553)
at android.widget.TextView.<init> + 1135(TextView.java:1135)
at android.widget.EditText.<init> + 107(EditText.java:107)
at android.widget.EditText.<init> + 103(EditText.java:103)
at android.widget.EditText.<init> + 99(EditText.java:99)
at android.widget.EditText.<init> + 95(EditText.java:95)
at com.facebook.react.views.textinput.ReactTextInputShadowNode.setThemedContext + 76(ReactTextInputShadowNode.java:76)
at com.facebook.react.uimanager.UIImplementation.createView + 294(UIImplementation.java:294)
at com.facebook.react.uimanager.UIManagerModule.createView + 462(UIManagerModule.java:462)
at java.lang.reflect.Method.invoke(Method.java)
at com.facebook.react.bridge.JavaMethodWrapper.invoke + 372(JavaMethodWrapper.java:372)
at com.facebook.react.bridge.JavaModuleWrapper.invoke + 158(JavaModuleWrapper.java:158)
at com.facebook.react.bridge.queue.NativeRunnable.run(NativeRunnable.java)
at android.os.Handler.handleCallback + 789(Handler.java:789)
at android.os.Handler.dispatchMessage + 98(Handler.java:98)
at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage + 29(MessageQueueThreadHandler.java:29)
at android.os.Looper.loop + 164(Looper.java:164)
at com.facebook.react.bridge.queue.MessageQueueThreadImpl$4.run + 232(MessageQueueThreadImpl.java:232)
at java.lang.Thread.run + 764(Thread.java:764)
ãããå€æŽããïŒ
state = {
data: []
}
ããã«ïŒ
constructor(props) {
super(props);
this.state = {
data: []
};
}
ç§ã®åé¡ãä¿®æ£ããŸããã ç¶æ ãã¯ã©ã¹å€æ°ãšããŠèšå®ããŠãåé¡ãªãã¯ããªã®ã§ãçç±ãããããŸãããïŒ èª°ã§ãïŒ
@wbodronããããããã¯ç¡é¢ä¿ã§ãã ã¯ã©ãã·ã¥ã¯ã©ã³ãã ã§ããããããªããªã£ããšæããããããŸããããå®éã«ã¯ããã§ã¯ãããŸããã ãããŠãç§ãäžã§èª¬æããéèŠãªãã€ã³ãhttps://github.com/facebook/react-native/issues/17530#issuecomment -500865260
cc @cpojer @shergin @sahrens
ã¢ã³ããã€ããããã«ããã©ã«ããåé€ããŸãã
Your_Project> android> app> build
åé€ããåŸã react-native run-android
å®è¡ããŸã
æ£åžžã«åäœããã¯ãã§ãã
ç§ã®ããã«åããïŒD
ç§ã¯ãã§ã«ãããè©ŠããunderlineColorAndroidãåé€ããŸãããããŸã åé¡ããããŸãã å¥ã®åé¿çãæã£ãŠãã人ã¯ããŸããïŒ
ãã®åé¡ã«ãããæ¬çªç°å¢ã§ãã¢ããªãã¯ã©ãã·ã¥ããŸããã åçŸããã®ãæ¬åœã«é£ããã®ã§ãããã¯åä»ãªãã°ã§ãã ç§ãã¡ã®ã¢ããªã®ææãªä¿®æ£ãèŠã€ããŸãããä»ã®äººã®æéãšãã©ã¹ãã¬ãŒã·ã§ã³ãç¯çŽã§ããããã«ãããã§ç§ãã¡ã®çºèŠãå ±æããããšæããŸãã
ä»æ§ãšããŒãžã§ã³
ãã®ãã°ã«ãããSamsungãGoogleãããã³LGAndroidããã€ã¹ã§ã¢ããªãã¯ã©ãã·ã¥ããŸããã 次ã®AndroidããŒãžã§ã³ããã¯ã©ãã·ã¥ã¬ããŒãããããŸãã
8.0.0
8.1.0
7.1.1
ç§ãã¡ã®ã¢ããªã¯å®è¡ãããŠããŸãïŒ
react-native
ïŒ0.53.0react
ïŒ16.2.0ã¯ã©ãã·ã¥ã®åå
ä»ã®äººããã®ã¹ã¬ããã§ææããŠããããã«ããã®åé¡ã¯
TextInput
ãFlatList
ãããã³ScrollView
ã³ã³ããŒãã³ãã®çµã¿åãããã¬ã³ããªã³ã°ããããšã«ãã£ãŠåŒãèµ·ããããããã§ãã ãã®äŸã§ã¯ãFlatList
äžã«ã¬ã³ããªã³ã°ãããåäžã®TextInput
ãå«ãç»é¢ããããŸããFlatList
ã®ã¢ã€ãã ã®1ã€ãã¿ãããããšãã¢ããªã¯ãã©ãŒã ãå«ãæ°ããç»é¢ã«ç§»åããŸãã ãã®ãã©ãŒã ã®ã«ãŒãã³ã³ããŒãã³ãã¯ScrollView
ã§ãããã€ãã®TextInput
ã³ã³ããŒãã³ããå«ãŸããŠããŸãïŒããã€ãã®ãã¿ã³ããã®ä»ã®ã«ã¹ã¿ã ã³ã³ããŒãã³ããå«ãŸããŠããŸãïŒã ãŠãŒã¶ãŒããããã®FlatList
ã¢ã€ãã ã®ãããããã¿ãããããšãã¢ããªãã¯ã©ãã·ã¥ããŸãïŒæ¯åçºçããããã§ã¯ãªãããšã«æ³šæããŠãã ããïŒã
ãã®åé¡ãåçŸããããšã¯å°é£ã§ãã å®éãç§ãã¡ã¯ããããããšãã§ããŸããã§ããã ãã ããAppseeã»ãã·ã§ã³ã®èšé²ãèŠããšãã¯ãŒã¯ãããŒã®ãã®æç¹ã§ã¯ã©ãã·ã¥ãçºçããŠããããšãããããŸãã
åé¡ãåçŸã§ããªããããAppseeã®ã¯ã©ãã·ã¥ãã°ã䜿çšããŠãããã°ããå¿ èŠããããŸããã 以äžã®ã¯ã©ãã·ã¥ã¬ããŒãããã¹ã¿ãã¯ãã¬ãŒã¹ãã³ããŒããŸããïŒãããŠãããã€ãã®ãã€ãºã®å€ãã»ã¯ã·ã§ã³ãçç¥ããŸããïŒã ããã¯ãä»ã®äººããã®ã¹ã¬ããã«æçš¿ããã¹ã¿ãã¯ãã¬ãŒã¹ãšã»ãŒåãã§ãã0 java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)' on a null object reference 1 at android.graphics.drawable.DrawableContainer$DrawableContainerState.createAllFutures(DrawableContainer.java:875) 2 at android.graphics.drawable.DrawableContainer$DrawableContainerState.getOpacity(DrawableContainer.java:1158) 3 at android.graphics.drawable.DrawableContainer.getOpacity(DrawableContainer.java:433) 4 at android.graphics.drawable.InsetDrawable.getOpacity(InsetDrawable.java:258) 5 at android.view.View.computeOpaqueFlags(View.java:16900) 6 at android.view.View.setBackgroundDrawable(View.java:21824) 7 at android.view.View.setBackground(View.java:21717) 8 at android.view.View.<init>(View.java:5577) 9 at android.widget.TextView.<init>(TextView.java:1144) ... 13 at android.widget.EditText.<init>(EditText.java:96) 14 at com.facebook.react.views.textinput.ReactEditText.<init>(ReactEditText.java:91) 15 at com.facebook.react.views.textinput.ReactTextInputManager.createViewInstance(ReactTextInputManager.java:91) 16 at com.facebook.react.views.textinput.ReactTextInputManager.createViewInstance(ReactTextInputManager.java:61) ... 35 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408)
åé¡ã®åå
ãã®ã¹ã¬ãããèªã¿ãæ°æéãŸãã¯èª¿æ»ãè¡ã£ãåŸã
ReactTextInputManager.java
ãã¡ã€ã«ã«underlineColorAndroid
propãã³ãã©ãŒãèŠã€ãããŸããã@ReactProp(name = "underlineColorAndroid", customType = "Color") public void setUnderlineColor(ReactEditText view, <strong i="44">@Nullable</strong> Integer underlineColor) { // Drawable.mutate() can sometimes crash due to an AOSP bug: // See https://code.google.com/p/android/issues/detail?id=191754 for more info Drawable background = view.getBackground(); Drawable drawableToMutate = background.getConstantState() != null ? background.mutate() : background; if (underlineColor == null) { drawableToMutate.clearColorFilter(); } else { drawableToMutate.setColorFilter(underlineColor, PorterDuff.Mode.SRC_IN); } }
ã³ã¡ã³ãã«ãªã³ã¯ãããŠãããã°ã¬ããŒãã«ã¯ã次ã®ã¹ã¿ãã¯ãã¬ãŒã¹ãå«ãŸããŠããŸãã
java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable()' on a null object reference at android.graphics.drawable.LayerDrawable$ChildDrawable.<init>(LayerDrawable.java:1723) at android.graphics.drawable.LayerDrawable$LayerState.<init>(LayerDrawable.java:1792) at android.graphics.drawable.LayerDrawable.createConstantState(LayerDrawable.java:152) at android.graphics.drawable.LayerDrawable.mutate(LayerDrawable.java:1652)
ããã¯ãã¢ããªã§çºçããŠããã¹ã¿ãã¯ãã¬ãŒã¹ãšäžèŽããŸãã æ ¹æ¬çãªåé¡ãå®å šã«ç解ããŠãããµããããŠããŸããããæ¬çªç°å¢ã§ã¢ããªãã¯ã©ãã·ã¥ããåå ã¯ã
Drawable.mutate()
ãã°ãããªã¬ãŒãããããšãåå ã§ããå¯èœæ§ããããŸãã ããã¯ãTextInput
ã³ã³ããŒãã³ãã«underlineColorAndroid
å°éå ·ãèšå®ããããšãããšãã«çºçããŸãïŒãããã£ãŠãReactTextInputManager.setUnderlineColor
ã¡ãœãããåŒã³åºããŸãïŒã
ç§ãã¡ã®ã¢ããªã¯ã次ã®å°éå ·ã§TextInput
ãã¬ã³ããªã³ã°ããŠããŸãããããã®ãã¡ã®1ã€ã¯underlineColorAndroid="transparent"
ïŒ<TextInput ref={this.handleRef} value={this.props.value} autoCorrect={false} autoCapitalize="none" underlineColorAndroid="transparent" onSubmitEditing={this.handleSubmit} onChangeText={this.props.onChangeText} onFocus={this.handleFocused} onBlur={this.handleBlur} clearButtonMode="always" />
ä¿®æ£æ¹æ³
ã¢ããªã®
TextInput
ã³ã³ããŒãã³ãããã¢ã³ããŒã¹ã³ã¢ãåé€ããã«ã¯ããã®å°éå ·ãèšå®ããå¿ èŠããããŸããã ããããç§ãã¡ã®èª¿æ»çµæã«åºã¥ããšããã®propãã³ãã©ãŒãAndroidã®ãã°ãåŒãèµ·ãããŠããããã§ãã¢ããªããšãã©ãã¯ã©ãã·ã¥ããŠããŸããã
幞ããAndroidã®TextInput
ã³ã³ããŒãã³ãããã¢ã³ããŒã¹ã³ã¢ãåé€ããå¥ã®æ¹æ³ããããŸããandroid/app/src/main/res/values/styles.xml
ãã¡ã€ã«ã«è¡ãè¿œå ã§ããŸãã<resources> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="android:windowExitAnimation"><strong i="67">@android</strong>:anim/fade_out</item> <item name="android:windowBackground">@drawable/splash_screen</item> + <item name="android:editTextBackground"><strong i="68">@android</strong>:color/transparent</item> </style> </resources>
ç§ã¯ãŸãã次ã®ããšã瀺åããèŠãŠãããããããç§ãã¡ã®ããã«äžç·ãåé€ããªãã£ãããšã«æ³šæããŠãã ããã
<resources> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="android:windowExitAnimation"><strong i="73">@android</strong>:anim/fade_out</item> <item name="android:windowBackground">@drawable/splash_screen</item> </style> + <!-- This did *not* work for us... --> + <style name="AppEditTextStyle" parent="@style/Widget.AppCompat.EditText"> + <item name="android:background"><strong i="74">@android</strong>:color/transparent</item> + </style> </resources>
ããã¯æ ¹æ¬çãªåé¡ã«å¯ŸåŠããŠããŸããã ããã¯ã
TextInput
ã³ã³ããŒãã³ãã§ã®underlineColorAndroid
ããããã®äœ¿çšãåé¿ããããšãå«ãåãªãåé¿çã§ãã
ããŒã«ã«ã§åé¡ãåçŸã§ããªãã£ãããããããå®éã«æ©èœãããã©ããã¯ãŸã ã¯ã£ãããšã¯èšããŸããã ãã®å€æŽã¯ãæ°é±é以å ã«ã¢ããªã®ã¢ããããŒãã§å±éãããŸãã ãã®åŸããããããçºçãããã©ããã確èªããããã«ãã°ããåŸ ã€å¿ èŠããããŸãã 調æ»çµæãå ±åããããšæããŸãã
ãã®èç«ãããåé¡ã«åãçµãã§ãããã¹ãŠã®äººã«é 匵ã£ãŠãã ããïŒ ãããã圹ã«ç«ãŠã°å¹žãã§ããç§ã¯ãã®ç¶æ³ãåçŸããæ¹æ³ãç¥ã£ãŠããŸãã èšã£ãããã«ãã©ãŒã ã«æ»ã£ãŠã¯ãªãã¯ãããã©ãããªã¹ãã®é ç®ãã¯ãªãã¯ããŠãã©ãŒã ã«å ¥åããŸãã çŽ10åç¹°ãè¿ããŸãããå°ãéããããšããã®ãšã©ãŒãçºçããŸãã ç§ãèšã£ãããšã«åŸã£ãŠãšã©ãŒãåçŸããããšãã§ããŸãã
ç§ã«äœãã§ããïŒ ç§ããã®åé¡ã«çŽé¢ããŠããŸãïŒ
ãã£ã¡ãäžç·ã çç£ã«çŽé¢ããŠãã
@ jake41åèµ·åããŠã¿ãŸãããã
@agrassç§ã¯ããªãã®æ¹æ³ãè©ŠããŠã¿ãŸãã ææã«èŠããŸãã
ããããç§ã®ã¢ããªã¯ãã®åå ã§éåžžã«ãŸãã«ã¯ã©ãã·ã¥ããŸãã ãã®åé¡ã«ãããã¢ããªã¯æ¯åã¯ã©ãã·ã¥ããŸããïŒ ãŸãã¯æã
ïŒ
ç§ãã¡ã®ã¢ããªã®DAUã¯çŽ8kã§ãããã¯çŽ1æ¥ã«1åçºçããŸãã ã§ããããããã¯ãããããã§ãããç§ã¯ã¯ã©ãã·ã¥ãæ²»ããããšæã£ãŠããŸãã
誰ããããã®ããã®é©åãªåäœä¿®æ£ãèŠã€ããŸãããïŒ ããã¯éåžžã«ãŸãã§ãããã¹ããã£ãŒã«ããããã³ã³ããŒãã³ãã§ã®ã¿çºçããŸãã
ãã®åé¡ã¯ReactNative0.60ã§ãåŒãç¶ãçºçããŸã
React NativeïŒ0.59.8
AndroidïŒ8.1.0
ããã€ã¹ïŒRedmi 5 Plus
Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)' on a null object reference
at android.graphics.drawable.DrawableContainer$DrawableContainerState.createAllFutures + 875(DrawableContainer.java:875)
at android.graphics.drawable.DrawableContainer$DrawableContainerState.getOpacity + 1158(DrawableContainer.java:1158)
at android.graphics.drawable.DrawableContainer.getOpacity + 433(DrawableContainer.java:433)
at android.graphics.drawable.InsetDrawable.getOpacity + 258(InsetDrawable.java:258)
at android.view.View.computeOpaqueFlags + 15726(View.java:15726)
at android.view.View.setBackgroundDrawable + 20536(View.java:20536)
at android.view.View.setBackground + 20429(View.java:20429)
at android.view.View.(View.java:5256)
at android.widget.TextView.(TextView.java:826)
at android.widget.EditText.(EditText.java:88)
at android.widget.EditText.(EditText.java:84)
at android.widget.EditText.(EditText.java:80)
at android.widget.EditText.(EditText.java:76)
at com.facebook.react.views.textinput.ReactEditText.(ReactEditText.java:89)
at com.facebook.react.views.textinput.ReactTextInputManager.createViewInstance + 105(ReactTextInputManager.java:105)
at com.facebook.react.views.textinput.ReactTextInputManager.createViewInstance + 65(ReactTextInputManager.java:65)
at com.facebook.react.uimanager.ViewManager.createView + 47(ViewManager.java:47)
at com.facebook.react.uimanager.NativeViewHierarchyManager.createView + 256(NativeViewHierarchyManager.java:256)
at com.facebook.react.uimanager.UIViewOperationQueue$CreateViewOperation.execute + 200(UIViewOperationQueue.java:200)
at com.facebook.react.uimanager.UIViewOperationQueue$DispatchUIFrameCallback.dispatchPendingNonBatchedOperations + 1109(UIViewOperationQueue.java:1109)
at com.facebook.react.uimanager.UIViewOperationQueue$DispatchUIFrameCallback.doFrameGuarded + 1080(UIViewOperationQueue.java:1080)
at com.facebook.react.uimanager.GuardedFrameCallback.doFrame + 29(GuardedFrameCallback.java:29)
at com.facebook.react.modules.core.ReactChoreographer$ReactChoreographerDispatcher.doFrame + 166(ReactChoreographer.java:166)
at com.facebook.react.modules.core.ChoreographerCompat$FrameCallback$1.doFrame + 84(ChoreographerCompat.java:84)
at android.view.Choreographer$CallbackRecord.run + 1027(Choreographer.java:1027)
at android.view.Choreographer.doCallbacks + 841(Choreographer.java:841)
at android.view.Choreographer.doFrame + 769(Choreographer.java:769)
at android.view.Choreographer$FrameDisplayEventReceiver.run + 1015(Choreographer.java:1015)
at android.os.Handler.handleCallback + 794(Handler.java:794)
at android.os.Handler.dispatchMessage + 99(Handler.java:99)
at android.os.Looper.loop + 176(Looper.java:176)
at android.app.ActivityThread.main + 6651(ActivityThread.java:6651)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run + 547(RuntimeInit.java:547)
at com.android.internal.os.ZygoteInit.main + 824(ZygoteInit.java:824)
ããã§åãåé¡ããããŸã
RNïŒ0.59.9
ããã€ã¹ïŒPixel 2
AndroidïŒ9.0
ããããã©ãŒã ç»é¢ã®å Žåãå ¥åã§å€ãå®çŸ©ããã®ãåŸ ã£ãŠãããããããŸãããããã¯ç§ã®ããã«åããŸããã
ç§ã¯è§£æ±ºçãèŠã€ããŸããã ãããé·æçãªãã®ãã©ããã¯ããããŸããããããã«ãããæ°žç¶çãªè§£æ±ºçãèŠã€ãããŸã§äœæ¥ãè¡ãããšãã§ããŸãã
çŸéãã¯ãªã¢ããã ãã§ãïŒnpm start --- reset-cache
ãããŠããããžã§ã¯ããåèµ·åããŸãã
ããã¯ç§ã®ããã«åããã
åèãŸã§ã«ãç§ã¯ãŸã ç§ã®ãããžã§ã¯ããæåºããŠããŸããã
ç§ã®äŸåé¢ä¿ïŒ
"devDependencies"ïŒ{
"@ types / react"ïŒ "^ 16.8.23"ã
"@ types / react-native"ïŒ "^ 0.57.65"ã
"babel-preset-expo"ïŒ "^ 6.0.0"ã
"typescript"ïŒ "^ 3.4.5"
}ã
ExpoKitïŒSDK 34ïŒãŠãŒã¶ãŒãããã«åå ããŠããŸãã ãã®åé¡ã¯ãææ°ã®ãã®ãå«ãExpoKitã®ãã¹ãŠã®ããŒãžã§ã³ã§çºçããŸããã ç§ã¯ãããã®ä¿®æ£ãããã€ãã®å€æŽãå ããŠé©çšããããšããŸãããããããŸã§ã®ãšããããšãŠãè¯ãã§ãã
ã¹ã¿ã€ã«ã®å€æŽã¯ã @ Hopdingãšã¯å°ãç°ãªã£ãŠãããŸããã styles.xmlã®ExponentEditText
ã¹ã¿ã€ã«ã次ã®ããã«å€æŽããŸããã
<style name="ExponentEditText" parent="<strong i="9">@android</strong>:style/Widget.EditText">
<item name="android:padding">0dp</item>
<item name="android:textColorHint">#c8c8c8</item>
<item name="android:textColor">#000000</item>
<item name="android:background"><strong i="10">@android</strong>:color/transparent</item>
</style>
android:editTextBackground
ãžã®å€æŽãæ©èœããªãã£ãããïŒããããããã®ExponentEditText
ã¹ã¿ã€ã«ããã§ã«ååšããŠããããšã«é¢ä¿ããŠããŸãïŒã èå³æ·±ãããšã«ã underlineColorAndroid
ãtransparent
èšå®ããããã©ã«ãã®å°éå
·ããããããå¿
èŠã¯ãããŸãã
以åã¯ãSectionListã«500 TextInputsãè¿œå ããã¢ããªã«è¿œå ãã蚺æãã¿ã³ã䜿çšããŠããšã©ãŒã確å®ã«ããªã¬ãŒããããšãã§ããŸããã ç§ã®çµéšã§ã¯ãæåã®è©Šè¡ã§60ïŒ ã2åç®ã§90ïŒ ã3åç®ã§100ïŒ ã®ç¢ºçã§ããªã¬ãŒããããšæããŸãã å€æŽãå ããåŸããšã©ãŒãªãã§å°ãªããšã10åè©Šè¡ããŸããã
ããã§åãåé¡ããããŸã
RNïŒ0.55.4
ããã€ã¹ïŒMI 8 Lite
AndroidïŒ8.1.0
java.lang.NullPointerExceptionïŒnullãªããžã§ã¯ãåç
§ã§ä»®æ³ã¡ãœãã 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable $ ConstantState.newDrawableïŒandroid.content.res.ResourcesïŒ'ãåŒã³åºãããšããŸãã
android.graphics.drawable.DrawableContainer $ DrawableContainerState.createAllFuturesïŒDrawableContainer.java:875ïŒã§
android.graphics.drawable.DrawableContainer $ DrawableContainerState.getOpacityïŒDrawableContainer.java:1158ïŒã§
android.graphics.drawable.DrawableContainer.getOpacityïŒDrawableContainer.java:433ïŒã§
android.graphics.drawable.InsetDrawable.getOpacityïŒInsetDrawable.java:258ïŒã§
android.view.View.computeOpaqueFlagsïŒView.java:15748ïŒã§
android.view.View.setBackgroundDrawableïŒView.java:20558ïŒã§
android.view.View.setBackgroundïŒView.java:20451ïŒã§
android.view.Viewã§ã
android.widget.TextViewã§ã
android.widget.EditTextã§ã
android.widget.EditTextã§ã
android.widget.EditTextã§ã
android.widget.EditTextã§ã
com.facebook.react.views.textinput.ReactTextInputShadowNode.setThemedContextïŒReactTextInputShadowNode.java:80ïŒã§
com.facebook.react.uimanager.UIImplementation.createViewïŒUIImplementation.java:282ïŒã§
com.facebook.react.uimanager.UIManagerModule.createViewïŒUIManagerModule.java:366ïŒã§
java.lang.reflect.Method.invokeïŒMethod.javaïŒã§
com.facebook.react.bridge.JavaMethodWrapper.invokeïŒJavaMethodWrapper.java:372ïŒã§
com.facebook.react.bridge.JavaModuleWrapper.invokeïŒJavaModuleWrapper.java:160ïŒã§
com.facebook.react.bridge.queue.NativeRunnable.runïŒNativeRunnable.javaïŒã§
android.os.Handler.handleCallbackïŒHandler.java:790ïŒã§
android.os.Handler.dispatchMessageïŒHandler.java:99ïŒã§
com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessageïŒMessageQueueThreadHandler.java:29ïŒã§
android.os.Looper.loopïŒLooper.java:164ïŒã§
com.facebook.react.bridge.queue.MessageQueueThreadImpl $ 3.runïŒMessageQueueThreadImpl.java:192ïŒã§
java.lang.Thread.runïŒThread.java:764ïŒã§
èŽåœçãªäŸå€ïŒjava.lang.NullPointerException
nullãªããžã§ã¯ãåç
§ã§ä»®æ³ã¡ãœãã 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable $ ConstantState.newDrawableïŒandroid.content.res.ResourcesïŒ'ãåŒã³åºãããšããŸãã
ã€ã³ãã1804
AndroidããŒãžã§ã³ïŒ9
ç§ã®ããã«èµ·ãã£ãŠããŸãã Android9ã§å®è¡ãããŠããReactNativeããŒãžã§ã³0.60.4ããã ããéåžžã«æç¶çã§ãŸãã§ãã
ç§ã®ããã«èµ·ãã£ãŠããŸãã Android9ã§å®è¡ãããŠããReactNativeããŒãžã§ã³0.60.4ããã ããéåžžã«æç¶çã§ãŸãã§ãã
ç§ãåãã§ã...
ããã§ãåãã§ãããAndroid9ã®ReactNative 0.60.4
ç§ã¯ReactNative with Expoã䜿çšããŠããŸãããä»æãã®åé¡ãçºçããŸããã
ç§ã¯æåã«ãã®è¡ãstyles.xmlAppThemeã«æ¬¡ã®ããã«é
眮ããããšããŸãã
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:editTextBackground"><strong i="9">@android</strong>:color/transparent</item>
</style>
ããã¯ããŸããããªãã£ãã®ã§ãç§ã¯å¥ã®å Žæãæ¢ããŠãæçµçã«ããã«çœ®ããŸããïŒ
<style name="Theme.ReactNative.AppCompat.Light.NoActionBar.FullScreen"
parent="@style/Theme.ReactNative.AppCompat.Light">
<item name="android:windowNoTitle">true</item>
<item name="windowActionBar">false</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:editTextBackground"><strong i="16">@android</strong>:color/transparent</item>
</style>
ä»ã¯å®å šã«ããŸãæ©èœããŠããããã§ã
ãã®ã¯ã©ãã·ã¥ã¯éåžžã«ã©ã³ãã ã§ãã åãã¹ã¿ãã¯ãã¬ãŒã¹ãv0.60.4ã åããšã©ãŒã 解決çã¯ãããŸããïŒ èª°ãããã«ããã©ã«ããåé€ããããšãææ¡ããŸãããããããnullãã€ã³ã¿ãšäœã®é¢ä¿ãããã®ãââããããŸãããïŒ è§£æ±ºçã¯åžžã«åæ§ç¯/åå®è¡ã®ããã§ã
@wxjerèšå®ã«é¢ããæ確ãªã¢ããªããŒã¿ãè©ŠããŠã¿ãŠããããæ©èœããŠããŸãïŒ ãã£ãŠã¿ãŸããã
ããã§ãåãã§ãããAndroid9ãšAndroid8ã®ReactNative 0.60.4
解決çã¯ãããŸããïŒ
誰ããAndroidã®ãããã°ã«ç®ãå ãããŠããå Žåã«åããŠãããã«å ±åãããæ©åšãšã©ãŒããããŸãã
åå¿ãã€ãã£ã0.60.4
https://sentry.io/share/issue/e0c581e2e99a4ca48199647b8bd3f497/
ããã§ãåãã§ãããAndroid9ã®ReactNative 0.60.5
ããã«ã¡ã¯ïŒ TextInputããunderlineColorAndroidããããã£ãåé€ãããã®è¡ãïŒandroid / src / main / res / values / styles.xmlïŒå ã®styles.xmlã«è¿œå ããããšã§ãããã解決ããŸããã
<item name="android:editTextBackground"><strong i="6">@android</strong>:color/transparent</item>
ããã¯ãã°ã¬ããŒãã§ããïŒ
ã¯ã
å¯çš¿ã¬ã€ãã©ã€ã³ãèªã¿ãŸãããïŒ
ã¯ããã¯ã©ãã·ã¥ã¬ããŒãã¯ã°ãŒã°ã«ã¢ããªãã£ã¯ã¹ããåéãããããããã®ã¹ã¿ãã¯ãã¬ãŒã¹ãé€ããŠããã®äŸå€ã«é¢ãã詳现æ å ±ãæäŸã§ããªãããšããè©«ã³ç³ãäžããŸãããã®äŸå€ãå床衚瀺ããããšã¯ã§ããŸããã
ç°å¢
ç°å¢ïŒ
OSïŒmacOS Sierra 10.12.6
ããŒãïŒ8.4.0
æ¯ç³žïŒ0.27.5
npmïŒ5.4.0
Android StudioïŒ3.0ããã±ãŒãž:(å¿ èŠ=>ã€ã³ã¹ããŒã«æžã¿ïŒ
react-nativeïŒ0.51.0 => 0.51.0
åå¿ïŒ16.0.0-alpha.12 => 16.0.0-alpha.12ã¿ãŒã²ãããã©ãããã©ãŒã ïŒAndroidïŒ7.1.1ïŒ
ã¢ãã€ã«ïŒMIX2
androidïŒ7.1.1
java.lang.NullPointerExceptionïŒ
nullãªããžã§ã¯ãåç §ã§ä»®æ³ã¡ãœãã 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable $ ConstantState.newDrawableïŒandroid.content.res.ResourcesïŒ'ãåŒã³åºããããšããŸãã
android.graphics.drawable.DrawableContainer $ DrawableContainerState.getChildïŒDrawableContainer.java:888ïŒat
android.graphics.drawable.DrawableContainer.selectDrawableïŒDrawableContainer.java:466ïŒat
android.graphics.drawable.StateListDrawable.onStateChangeïŒStateListDrawable.java:104ïŒat
android.graphics.drawable.Drawable.setStateïŒDrawable.java:735ïŒat
android.graphics.drawable.DrawableWrapper.onStateChangeïŒDrawableWrapper.java:331ïŒat
android.graphics.drawable.Drawable.setStateïŒDrawable.java:735ïŒat
android.graphics.drawable.LayerDrawable.onStateChangeïŒLayerDrawable.java:1488ïŒat
android.graphics.drawable.Drawable.setStateïŒDrawable.java:735ïŒat
android.view.View.drawableStateChangedïŒView.java:18002ïŒat
android.widget.TextView.drawableStateChangedïŒTextView.java:4097ïŒat
android.view.View.refreshDrawableStateïŒView.java:18071ïŒat
android.view.View.setPressedïŒView.java:8543ïŒat
android.view.View.setPressedïŒView.java:8521ïŒat
android.view.View.onTouchEventïŒView.java:11218ïŒat
android.widget.TextView.onTouchEventïŒTextView.java:8467ïŒat
com.facebook.react.views.textinput.ReactEditText.onTouchEventïŒReactEditText.java:150ïŒ
åå¿ãã€ãã£ã0.60.4ç§ã
æè¿ããã®ã¯ã©ãã·ã¥ã«ééãå§ããŸãããRN0.60.5ãäž»ã«Android 8/9ïŒãããã10ãããŸã ããã»ã©åºç¯å²ã«ãã¹ããããŠããŸããïŒã
https://github.com/facebook/react-native/issues/17530#issuecomment-504044357ãç§ã®ããã«ããªãã¯ãããŠããããã§ãã éåžžãã¯ã©ãã·ã¥ã¯ããã¹ãã³ã³ããŒãã³ããééããæåã®çŽ5åã®å埩å ã«çŸããŸãã ãã®1è¡ãè¿œå ããåŸãåæ¢ããåã«ã¯ã©ãã·ã¥ããããšãªãæ倧200åã®å埩ãå®è¡ããŸããã
ç·šéïŒãã¹ãã³ã³ããŒãã³ãã䜿çšãããšãAndroid 6ã§ãããã確å®ã«åçŸã§ããŸãããææ¡ãããä¿®æ£ã§åé¡ã解決ããããã§ãã
ããRN0.61ã§ãåã
ããã«ã¡ã¯ã¿ããªã @ diegotsiãœãªã¥ãŒã·ã§ã³ã¯ç§ã®ããã«åããã 圌ã®ãœãªã¥ãŒã·ã§ã³ã䜿çšããŠä»¥æ¥ãã¯ã©ãã·ã¥ãèŠãããšããããŸãã
ãã®åé¡ã¯ãŸã ååšããã¢ããªãå£ããŸãã-ãã§ããåŒã³åºããè¿œå ããããããã¹ãŠãæ£åžžã«æ©èœããŠããŸããããã³ã¡ã³ãã¢ãŠãããŠãã¢ããªãå床å®è¡ããããšã¯ã§ããŸããïŒcryïŒExpobtwã䜿çšããŠããŸã
ç·šéïŒããã€ã¹ã«expoã¢ããªãåã€ã³ã¹ããŒã«ããããšã§ãexpoã®åé¡ãä¿®æ£ããŸãã
ãã®ãšã©ãŒãçºçããŸããïŒRNïŒ0.61.1ãAndroid 10 api 29ïŒã 'npm start--reset-cache'ãä¿®æ£ãããããã§ãã
@johnbowdenatfacetäžèšã®ã³ã¡ã³ãã§æäŸããå§ãããŸãã
åãåé¡ã
React-Native 0.59.10
ã¢ã³ããã€ã
java.lang.NullPointerExceptionïŒnullãªããžã§ã¯ãåç
§ã§ä»®æ³ã¡ãœãã 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable $ ConstantState.newDrawableïŒandroid.content.res.ResourcesïŒ'ãåŒã³åºãããšããŸãã
android.graphics.drawable.DrawableContainer $ DrawableContainerState.createAllFuturesïŒDrawableContainer.java:875ïŒã§
android.graphics.drawable.DrawableContainer $ DrawableContainerState.getOpacityïŒDrawableContainer.java:1158ïŒã§
android.graphics.drawable.DrawableContainer.getOpacityïŒDrawableContainer.java:433ïŒã§
android.graphics.drawable.InsetDrawable.getOpacityïŒInsetDrawable.java:258ïŒã§
åãåé¡ã
ããã«ã¡ã¯ïŒ TextInputããunderlineColorAndroidããããã£ãåé€ãããã®è¡ãïŒandroid / src / main / res / values / styles.xmlïŒå ã®styles.xmlã«è¿œå ããããšã§ãããã解決ããŸããã
<item name="android:editTextBackground"><strong i="7">@android</strong>:color/transparent</item>
ç§ã®åé¡ã解決ããŸãããã©ããããããšãããããŸããã
ç§ã¯ã¡ããã©èµ°ã£ãïŒreact-native run-androidïŒãããã¯ç§ãšã®åé¡ã解決ããŸãã
0.61.3ã§åãåé¡
ç§ã¯ãŸã åé¡ã«çŽé¢ããŠããŸãã Androidã¢ããªã®ã¯ã©ãã·ã¥ãå ±åããŠãããŠãŒã¶ãŒãããŸãããã©ã³ãã ã«çºçãããããåçŸã§ããŸããã
+1ãç§ã«ãèµ·ãã£ã
ãã€ãã£ãããŒã¹ããã€ã³ããŒããããå ¥åã®åé¡ãçµã蟌ã¿ãŸããã
æŽæ°ããŸããïŒ
PCãšé»è©±ãåèµ·åããŠããå床å®è¡ããŸãããé
åã®ããã«æ©èœããŸãã:)
ç§ããããæã£ãŠããŸããã expo r -c
ä»ããŠãšãã¹ããåå®è¡ããããšã§åé¡ã解決ããŸãã
RN0.59.10ã«ã€ããŠåãåé¡ãå ±å
æåãã¹ãã¯éåžžã«è¡ãåœããã°ã£ããã§ããããšãããã£ãã®ã§ãäžèšã§å ±åãããŠããã·ããªãªã®ããã€ããèªåçã«ãã¹ãããã³ã³ããŒãã³ããäœæããŸããã 以äžã®ã³ã³ããŒãã³ãããããŸãã ããªãã¯ããããã®ä»äºãããããã«ã©ããã«ãããã¬ã³ããªã³ã°ããå¿ èŠããããŸãã
ãããè¡ããšã@ Hopdingã«ãã£ãŠææ¡ãããŠããããã«ãstyles.xmlã®AppThemeã«ä»¥äžãè¿œå ããã ãã§ããããšãããããŸããã
<item name="android:editTextBackground"><strong i="8">@android</strong>:color/transparent</item>
ä»ã«äœãå¿ èŠãªãã
underlineColorAndroid
èšå®ãåé¿ããå¿ èŠã¯ãªãã£ãã®ã§ãReactNativeãããã©ã«ãã§èšå®ããããã«ãªã£ãã®ã¯åé¡ã§ã¯ãããŸããã§ããããã®ä¿®æ£ã®äž»ãªæ¬ ç¹ã¯ãçµæãšããŠããã£ã³ã°ã倱ãããããã«TextInputsã®ã¹ã¿ã€ã«ãå€æŽããå¿ èŠãããããšã§ãããŸããå®éã®äžç·ã®åäœã倱ãããŸããããã¯ãåžžã«ãééçãã«èšå®ããŠãããããã¡ãªããããããŸãã iOSãšã®äžè²«æ§ãä¿ã€ããã å¿ èŠã«å¿ããŠã
onFocus
ãšonBlur
ãç£èŠããã©ãããŒã³ã³ããŒãã³ããäœæããç¬èªã®äžç·ãä»ããããšãã§ããŸããReactNativeã®ç§ã®ããŒãžã§ã³ã¯0.57.3ã§ã
ãã¹ãã³ã³ããŒãã³ãã䜿çšããŠèŠã€ãããã®ä»ã®äºé ã¯æ¬¡ã®ãšããã§ãã
- äœã¹ããã¯ã®Androidã¿ãã¬ããããã€ã¹ã§ã¯ãã¯ã©ãã·ã¥ããŸã£ããåŒãèµ·ããããšãã§ããŸããã§ããã ãã ããAndroid7ãå®è¡ããŠããSamsungS6 Edgeé»è©±ã§ã¯ãåçŸããã®ã¯éåžžã«ç°¡åã§ããããããèªçºããã«ã¯ãããé«éãªããã€ã¹ãå¿ èŠãªã¬ãŒã¹æ¡ä»¶ããããšæããŸãã
- ããã¹ãå ¥åãã¹ã¯ããŒã«ããŠãéãã¯ãªããScrollViewã䜿çšããªããŠãåé¡ãç°¡åã«åçŸã§ããŸããã
- ããã¹ããå ¥åããå¿ èŠã¯ãããŸããã§ããã ãã©ãŒã«ã¹ãå€æŽããã ãã§ã¯ã©ãã·ã¥ãçºçããŸããã
- äžç·ãã©ã®è²ã«èšå®ããŠãéãã¯ãªãã
undefined
ã§ãã¯ã©ãã·ã¥ãçºçããŸããããRNã®ããã©ã«ãããéæãã«ãªã£ãŠãããããããããäºæ³ãããã§ãããã- ããªãã®æ°ã®TextInputãäžåºŠã«è¡šç€ºããããšã§ãç»é¢ã«10åã ãã§ã¯ãªãã100åã®ã¯ã©ãã·ã¥ãããéãçºçãããšããéããçãŸããŸããã
displayForMs: 0
ã¯ã©ãã·ã¥ãåçŸã§ããŸãããã¹ãäžã«ã¶ãã¶ãããããªãå Žåã¯ã
adb logcat
ã®åºåããã£ããã£ããŠãã³ã³ããŒãã³ãã«ãã£ãŠçæãããã³ã³ãœãŒã«ã¡ãã»ãŒãžãšã¯ã©ãã·ã¥ã¬ããŒããæ¢ãããšãã§ããŸãããããç§ã®ãã¹ãã³ã³ããŒãã³ãã§ãã ãã¹ããã©ã¡ãŒã¿ã¯ãéåžž30ç§ä»¥å ã«ã¯ã©ãã·ã¥ãåŒãèµ·ããããã«èšå®ãããŠããŸãã
/** * A test component to reproduce the crash reported at * https://github.com/facebook/react-native/issues/17530 */ import * as React from "react"; import { View, ScrollView, TextInput, Text, StyleSheet } from "react-native"; // These are the test parameters const params = { underlineColors: ["red", undefined, "transparent", "rgba(0, 0, 0, 0)"], // The colors to test numberOfInputs: 100, // How many TextInput to render at a time focusIntervalMs: 200, // How often to change focus between them displayForMs: 3000, // How long to display them (set to 0 for indefinite) delayDisplayForMs: 10, // How long to delay between displays withScrollView: false // Whether to use a ScrollView }; const testText = index => `Testing underlineColor = ${params.underlineColors[index] || "undefined"}`; class AndroidTextInputTest extends React.Component{ state = { underlineColorIndex: 0, showInputs: true, startKey: 0 }; mounted = false; focusInterval = undefined; textInputRefs = undefined; focussedInputIndex = 0; componentDidMount() { console.log(`Testing with params = `, JSON.stringify(params)); this.mounted = true; setTimeout(this._showInputs, params.delayDisplayForMs); setInterval(this._focusAnInput, params.focusIntervalMs); } componentWillUnmount() { clearInterval(this.focusInterval); this.mounted = false; } _focusAnInput = () => { if (this.mounted && this.textInputRefs) { if (this.focussedInputIndex >= this.textInputRefs.length) { this.focussedInputIndex = 0; } const textInputRef = this.textInputRefs[this.focussedInputIndex]; const textInput = this.refs[textInputRef]; if (textInput) { this.focussedInputIndex++; this.refs[textInputRef].focus(); } } }; _showInputs = () => { if (this.mounted) { console.log(testText(this.state.underlineColorIndex)); this.setState({ showInputs: true }); if (params.displayForMs) { setTimeout(this._unshowInputs, params.displayForMs); } } }; _unshowInputs = () => { this.focussedInputIndex = 0; this.textInputRefs = undefined; if (this.mounted) { let next = this.state.underlineColorIndex + 1; if (next === params.underlineColors.length) { next = 0; } this.setState({ underlineColorIndex: next, showInputs: false, startKey: this.state.startKey + params.numberOfInputs }); setTimeout(this._showInputs, params.delayDisplayForMs); } }; render() { const textInputs = []; const { underlineColorIndex } = this.state; const underlineColor = params.underlineColors[underlineColorIndex]; const refs = []; if (this.state.showInputs) { for (let i = 0; i < params.numberOfInputs; i++) { const key = this.state.startKey + i + ""; refs.push(key); textInputs.push( <TextInput ref={key} key={key} placeholder={key} underlineColorAndroid={underlineColor} style={styles.textInput} /> ); } if (!this.textInputRefs) { this.textInputRefs = refs; } } return ( <View style={styles.mainView}> <Text>{testText(underlineColorIndex)}</Text> {params.withScrollView ? ( <React.Fragment> <Text>With ScrollView</Text> <ScrollView>{textInputs}</ScrollView> </React.Fragment> ) : ( <React.Fragment>{textInputs}</React.Fragment> )} </View> ); } } const styles = StyleSheet.create({ mainView: { flex: 1, alignItems: "center" }, textInput: { backgroundColor: "white", margin: 5, width: 300 } }); export default AndroidTextInputTest;
ãããè©ŠããŸããããããŒããŒããTextInputsã«è¡šç€ºãããŸããã§ããã 解決çã¯ãããŸããïŒ
ã³ã³ããŒãã³ã@saketkumarããè©Šãããã ãããããšãããããŸãã
ãã®ãã¹ãã§ããŒããŒãã衚瀺ããå¿ èŠããããã©ããã¯æãåºããŸããããããã¹ãå ¥åã«ãã©ãŒã«ã¹ããããšãã«è¡šç€ºããããšæããŸãã å®éã®ããã€ã¹ãŸãã¯ãšãã¥ã¬ãŒã¿ãŒã䜿çšããŠããŸããïŒ
ãã©ãŒã«ã¹ãããããã¹ãå ¥åã«ã«ãŒãœã«ã衚瀺ãããã³ã³ããŒãã³ããã¯ã©ãã·ã¥ãåçŸã§ããŸãããïŒ
åã
ããŸããŸãªAndroidæºåž¯ã§åå¿0.59ã§çºçããŸãã
TextInput
ãFlatlist
å
ã«ãã¹ããããŠããã³ã³ããŒãã³ãã§ã©ã³ãã ã«çºçããŸã
ãã®ã¹ã¬ããã§èª¬æãããŠããããã«ã underlineColorAndroid={null}
å±æ§ãTextInput
ã«èšå®ããããšããŸãããããšã©ãŒã解決ããŸãã
ä¿®æ£ããã«ã¯ãé»è©±ãåèµ·åããŠEXPOãåã€ã³ã¹ããŒã«ããå¿ èŠããããŸããã ãããããŸããããªãå Žåã¯ããã£ãã·ã¥ãã¯ãªã¢ããŠãEXPOAPPèªäœã®ãã£ãã·ã¥ãã¯ãªã¢ããŠã¿ãŸãã
ããããããã®ãšã©ãŒãã©ã®ããã«çºçããã®ãããããŸããã§ããã ç§ã¯ãããåçŸããããšãããããåã³èµ·ããã®ãé²ãæ¹æ³ãç解ããããšãã§ããŸããã§ããã
ããã¯å§ãŸã£ãã°ããã§ãã³ãŒãã§äœãå€æŽããŠãä¿®æ£ãããŸããã§ããã APPã«ã¯ãšã©ãŒã衚瀺ãããŸãããã³ã³ãœãŒã«ããã®ä»ã®å Žæã«ã¯è¡šç€ºãããªããããããã¯EXPOAPPã®åé¡ã§ãã
+1ãšã©ãŒã¯RN0.59.9ã«ãŸã ååšããŸãã FirebaseCrashlyticsããå ±åãããŸãã
RN 0.61ã§ãã®ãšã©ãŒãçºçããæåã®åé¡ã¯ïŒ
RN 0.61ã§åããšã©ãŒãçºçããŸãããã @ diegotsiã®ãœãªã¥ãŒã·ã§ã³ã§ä¿®æ£ãããŸããã
ããã¯ãå®çšŒååã®ç°å¢ã§æåã«çºçããé倧ãªåé¡ã§ãããåäœãäžå®å®ãªããåçŸãå°é£ãªãããã¯ã©ãã·ã¥ãªãã£ãã¯ãªãã§ã¯è¿œè·¡ã§ããŸããã§ããã
ããã¯ãã°ã¬ããŒãã§ããïŒ
ã¯ã
å¯çš¿ã¬ã€ãã©ã€ã³ãèªã¿ãŸãããïŒ
ã¯ããã¯ã©ãã·ã¥ã¬ããŒãã¯ã°ãŒã°ã«ã¢ããªãã£ã¯ã¹ããåéãããããããã®ã¹ã¿ãã¯ãã¬ãŒã¹ãé€ããŠããã®äŸå€ã«é¢ãã詳现æ å ±ãæäŸã§ããªãããšããè©«ã³ç³ãäžããŸãããã®äŸå€ãå床衚瀺ããããšã¯ã§ããŸããã
ç°å¢
ç°å¢ïŒ
OSïŒmacOS Sierra 10.12.6
ããŒãïŒ8.4.0
æ¯ç³žïŒ0.27.5
npmïŒ5.4.0
Android StudioïŒ3.0ããã±ãŒãž:(å¿ èŠ=>ã€ã³ã¹ããŒã«æžã¿ïŒ
react-nativeïŒ0.51.0 => 0.51.0
åå¿ïŒ16.0.0-alpha.12 => 16.0.0-alpha.12ã¿ãŒã²ãããã©ãããã©ãŒã ïŒAndroidïŒ7.1.1ïŒ
ã¢ãã€ã«ïŒMIX2
androidïŒ7.1.1
java.lang.NullPointerExceptionïŒ
nullãªããžã§ã¯ãåç §ã§ä»®æ³ã¡ãœãã 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable $ ConstantState.newDrawableïŒandroid.content.res.ResourcesïŒ'ãåŒã³åºããããšããŸãã
android.graphics.drawable.DrawableContainer $ DrawableContainerState.getChildïŒDrawableContainer.java:888ïŒat
android.graphics.drawable.DrawableContainer.selectDrawableïŒDrawableContainer.java:466ïŒat
android.graphics.drawable.StateListDrawable.onStateChangeïŒStateListDrawable.java:104ïŒat
android.graphics.drawable.Drawable.setStateïŒDrawable.java:735ïŒat
android.graphics.drawable.DrawableWrapper.onStateChangeïŒDrawableWrapper.java:331ïŒat
android.graphics.drawable.Drawable.setStateïŒDrawable.java:735ïŒat
android.graphics.drawable.LayerDrawable.onStateChangeïŒLayerDrawable.java:1488ïŒat
android.graphics.drawable.Drawable.setStateïŒDrawable.java:735ïŒat
android.view.View.drawableStateChangedïŒView.java:18002ïŒat
android.widget.TextView.drawableStateChangedïŒTextView.java:4097ïŒat
android.view.View.refreshDrawableStateïŒView.java:18071ïŒat
android.view.View.setPressedïŒView.java:8543ïŒat
android.view.View.setPressedïŒView.java:8521ïŒat
android.view.View.onTouchEventïŒView.java:11218ïŒat
android.widget.TextView.onTouchEventïŒTextView.java:8467ïŒat
com.facebook.react.views.textinput.ReactEditText.onTouchEventïŒReactEditText.java:150ïŒ
ããã¯ãã°ã¬ããŒãã§ããïŒ
ã¯ã
å¯çš¿ã¬ã€ãã©ã€ã³ãèªã¿ãŸãããïŒ
ã¯ããã¯ã©ãã·ã¥ã¬ããŒãã¯ã°ãŒã°ã«ã¢ããªãã£ã¯ã¹ããåéãããããããã®ã¹ã¿ãã¯ãã¬ãŒã¹ãé€ããŠããã®äŸå€ã«é¢ãã詳现æ å ±ãæäŸã§ããªãããšããè©«ã³ç³ãäžããŸãããã®äŸå€ãå床衚瀺ããããšã¯ã§ããŸããã
ç°å¢
ç°å¢ïŒ
OSïŒmacOS Sierra 10.12.6
ããŒãïŒ8.4.0
æ¯ç³žïŒ0.27.5
npmïŒ5.4.0
Android StudioïŒ3.0ããã±ãŒãž:(å¿ èŠ=>ã€ã³ã¹ããŒã«æžã¿ïŒ
react-nativeïŒ0.51.0 => 0.51.0
åå¿ïŒ16.0.0-alpha.12 => 16.0.0-alpha.12ã¿ãŒã²ãããã©ãããã©ãŒã ïŒAndroidïŒ7.1.1ïŒ
ã¢ãã€ã«ïŒMIX2
androidïŒ7.1.1
java.lang.NullPointerExceptionïŒ
nullãªããžã§ã¯ãåç §ã§ä»®æ³ã¡ãœãã 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable $ ConstantState.newDrawableïŒandroid.content.res.ResourcesïŒ'ãåŒã³åºããããšããŸãã
android.graphics.drawable.DrawableContainer $ DrawableContainerState.getChildïŒDrawableContainer.java:888ïŒat
android.graphics.drawable.DrawableContainer.selectDrawableïŒDrawableContainer.java:466ïŒat
android.graphics.drawable.StateListDrawable.onStateChangeïŒStateListDrawable.java:104ïŒat
android.graphics.drawable.Drawable.setStateïŒDrawable.java:735ïŒat
android.graphics.drawable.DrawableWrapper.onStateChangeïŒDrawableWrapper.java:331ïŒat
android.graphics.drawable.Drawable.setStateïŒDrawable.java:735ïŒat
android.graphics.drawable.LayerDrawable.onStateChangeïŒLayerDrawable.java:1488ïŒat
android.graphics.drawable.Drawable.setStateïŒDrawable.java:735ïŒat
android.view.View.drawableStateChangedïŒView.java:18002ïŒat
android.widget.TextView.drawableStateChangedïŒTextView.java:4097ïŒat
android.view.View.refreshDrawableStateïŒView.java:18071ïŒat
android.view.View.setPressedïŒView.java:8543ïŒat
android.view.View.setPressedïŒView.java:8521ïŒat
android.view.View.onTouchEventïŒView.java:11218ïŒat
android.widget.TextView.onTouchEventïŒTextView.java:8467ïŒat
com.facebook.react.views.textinput.ReactEditText.onTouchEventïŒReactEditText.java:150ïŒ
ããã¯ãjustifyContentãsmthngããã®ããã«åé€ãããªã©ã®ã¹ã¿ã€ã«ãå€æŽããŠããŠãã¢ããªã®åèµ·åãäžæçã«æ©èœããå Žåã«çºçããŸãã
@ cinocai ã @ Sargnec et alããã®ã³ã¡ã³ãã¹ã¬ããã¯éåžžã«é·ããªã£ãŠããã®ã§ãç§ãäžã«æçš¿ãããã¹ãã³ã³ããŒãã³ããäžè¶³ããŠãããšæããŸã
äžèšã®äœäººãã®äººã ã¯ããã®åé¡ãããŸãåçŸãããã®ã³ã¡ã³ãã«ãèšèŒãããŠãã解決çãæ€èšŒããããã«ããã䜿çšããŸããã
@ glenn-axsyïŒãã¹ãã³ã³ããŒãã³ãã§ã®çŽ æŽãããäœæ¥ã¯ãåé¡ãããããç解ããã®ã«éåžžã«åœ¹ç«ã¡ãŸããã
ããããç§ã¯è§£æ±ºçãèŠã€ããã®ã«èŠåŽããŠããŸãã
displayForMs: 0
èšå®æã«ææ¡ããããã«ãã¯ã©ãã·ã¥ããŸããã ç§ãééã£ãŠããªããã°ãããããããšã§ã 100
TextInputsãã¢ã³ããŠã³ããããããšã¯ãªãïŒæŽæ°ã®ã¿ïŒãæ°ãããã®ãã¢ã³ããŠã³ããããŸããã
displayForMs: 3000
èªäœãèšå®ããŠã¿ãŠãä»ã«2ã€ã®å€æŽãå ããŸãããããã«ããããã¹ãŠã®100
ãåèšå®ç¶æ
ã«ããŠã³ãããããŸãŸã«ãªããŸããïŒæŽæ°ã®ã¿ïŒã
å€æŽç¹
${i}
;if (this.state.showInputs) {
ãç¡å¹ã«ããŸãããã³ãŒã
/**
* A test component to reproduce the crash reported at
* https://github.com/facebook/react-native/issues/17530
*/
import * as React from 'react';
import { View, ScrollView, TextInput, Text, StyleSheet } from 'react-native';
// These are the test parameters
const params = {
underlineColors: ['red', undefined, 'transparent', 'rgba(0, 0, 0, 0)'], // The colors to test
numberOfInputs: 100, // How many TextInput to render at a time
focusIntervalMs: 200, // How often to change focus between them
displayForMs: 3000, // How long to display them (set to 0 for indefinite)
delayDisplayForMs: 10, // How long to delay between displays
withScrollView: false, // Whether to use a ScrollView
};
const testText = index =>
`Testing underlineColor = ${params.underlineColors[index] || 'undefined'}`;
class AndroidTextInputTest extends React.Component {
state = {
underlineColorIndex: 0,
showInputs: true,
startKey: 0,
};
mounted = false;
focusInterval = undefined;
textInputRefs = undefined;
focussedInputIndex = 0;
componentDidMount() {
console.log('Testing with params = ', JSON.stringify(params));
this.mounted = true;
setTimeout(this._showInputs, params.delayDisplayForMs);
setInterval(this._focusAnInput, params.focusIntervalMs);
}
componentWillUnmount() {
clearInterval(this.focusInterval);
this.mounted = false;
}
_focusAnInput = () => {
if (this.mounted && this.textInputRefs) {
if (this.focussedInputIndex >= this.textInputRefs.length) {
this.focussedInputIndex = 0;
}
const textInputRef = this.textInputRefs[this.focussedInputIndex];
const textInput = this.refs[textInputRef];
if (textInput) {
this.focussedInputIndex++;
this.refs[textInputRef].focus();
}
}
};
_showInputs = () => {
if (this.mounted) {
console.log(testText(this.state.underlineColorIndex));
this.setState({ showInputs: true });
if (params.displayForMs) {
setTimeout(this._unshowInputs, params.displayForMs);
}
}
};
_unshowInputs = () => {
this.focussedInputIndex = 0;
this.textInputRefs = undefined;
if (this.mounted) {
let next = this.state.underlineColorIndex + 1;
if (next === params.underlineColors.length) {
next = 0;
}
this.setState({
underlineColorIndex: next,
showInputs: false,
startKey: this.state.startKey + params.numberOfInputs,
});
setTimeout(this._showInputs, params.delayDisplayForMs);
}
};
render() {
const textInputs = [];
const { underlineColorIndex } = this.state;
const underlineColor = params.underlineColors[underlineColorIndex];
const refs = [];
// CHANGE 2
// if (this.state.showInputs) {
for (let i = 0; i < params.numberOfInputs; i++) {
const key = `${i}`; // CHANGE 1
refs.push(key);
textInputs.push(
<textinput i="23"/>
);
}
if (!this.textInputRefs) {
this.textInputRefs = refs;
}
// }
return (
<view i="24">
<text i="25">{testText(underlineColorIndex)}</text>
{params.withScrollView ? (
<react.fragment i="26">
<text i="27">With ScrollView</text>
<scrollview i="28">{textInputs}</scrollview>
</react.fragment>
) : (
<react.fragment i="29">{textInputs}</react.fragment>
)}
</view>
);
}
}
const styles = StyleSheet.create({
mainView: {
flex: 1,
alignItems: 'center',
},
textInput: {
backgroundColor: 'white',
margin: 5,
width: 300,
},
});
export default AndroidTextInputTest;
ã©ã¡ãã®å€æŽã§ãã _showInputs
ãš_unshowInputs
ãåŒã³åºããšãTextInputsãåããŠã³ãããããnewïŒæ倧100ïŒãããŠã³ããããªãããšã確èªãããŸããã
ãããŠãããã¯æåŸ
éãã«ã¯ã©ãã·ã¥ããŸããã
æåŸã«ãåé¡ã®åå ãå®éã«åããŠã³ããããŠãããã©ããïŒå€æ°ã®TextInputsïŒã確èªããŸãã ã¯ã©ãã·ã¥ãå ±åããããäœæ¥äžã®ã¢ããªã§åçŸããããšããŸããã
ã¢ããªã«ã¯2ã€ã®ç»é¢ããããŸãã1ã€ã¯2ã€ã®TextInputsã§ããã1ã€ã¯4ã€ã§ããç»é¢ãååŸã«ç§»åãç¶ããŸããããã¡ãããç»é¢ã®ã³ã³ãã³ãå šäœãåããŠã³ãããããã°ãããããšã¯ã©ãã·ã¥ããå¯èœæ§ããããŸããã
ããã«ããã TextInput
ã¢ã³ããŠã³ããããªãããšã¯å®è¡å¯èœãªè§£æ±ºçã§ã¯ãªããšæšæž¬ã§ããŸãã ãããããããæ£ç¢ºã«åŒãèµ·ãããŠããçç±ã¯ãŸã ããããŸããïŒ
泚æ
<item name="android:editTextBackground"><strong i="18">@android</strong>:color/transparent</item>
ã§ãªãŒããŒã©ã€ãããããšããã®ã§ã underlineColorAndroid
ããããã£ã«é¢é£ããŠãããšã¯æããŸããããéãã¯ãããŸãããScrollView
ã䜿çšããã«ã¯ã©ãã·ã¥ããããšãã§ããŸãããTextInput
ã«çŠç¹ãåãããå¿
èŠããããŸããã§ãããåã«ããããã®100
TextInputsãåããŠã³ããããšã¯ã©ãã·ã¥ããŸãããããããšãïŒ
@rimziciã¯ããããã§ãã ã¯ã©ãã·ã¥ã¯ãç·šéããã¹ãã®åããŠã³ã/ã€ã³ã¹ã¿ã³ã¹åã«é¢é£ããŠãããèæ¯ã®ãããŒã¢ãã«ãnullã«ãªãå ŽåããããŸãã ãããäžæè°ãªããšã«ã <item name="android:editTextBackground"><strong i="6">@android</strong>:color/transparent</item>
ãèšå®ãããšãããã¯èµ·ãããŸããã ãããŒã¢ãã«ã¯ã¯ããŒã³äœæåŸã«äœããã®åœ¢ã§ãªãµã€ã¯ã«ãããããã§ãããèæ¯ãèšå®ãããšããã©ã«ãå€ã«ãªããŸããïŒ
@rimziciã«æè¬ããŸãã
<item name="android:editTextBackground"><strong i="6">@android</strong>:color/transparent</item>
èšå®ããã ãã§ã¯ä¿®æ£ãããªãã£ããšèããŠããã£ããããŸããã å°ãªããšãããšã©ãŒãç°¡åã«åçŸããæ¹æ³ããããä»ã®ããã€ãã®ããšãè©Šãããšãã§ããŸãã
ããªããæã£ãŠãããããããªããããªã芳å¯ãæçš¿ããŠãã ããã
@sunnylqmãš@ glenn-axsyã«æè¬ããŸãïŒ ããªãã¯æ£ããã§ãã <item name="android:editTextBackground"><strong i="6">@android</strong>:color/transparent</item>
èšå®ããããšã¯ç¢ºãã«ä¿®æ£ããŸãã
JSã®èªã¿èŸŒã¿äžã«çœãç»é¢ãã«ããŒããããã«ãã¡ã€ã³ã¢ã¯ãã£ããã£ã«ã¹ãã©ãã·ã¥ããŒããèšå®ããããšãå¿ããŸããã
ããã§ãåé¿çãã¯ã©ãã·ã¥ã®é²æ¢ã«å¹æçã§ããããšã確èªã§ããŸããã
ãã以äžã®æ å ±ã§æŽæ°ãããŸãã
react-native 0.61.5 <-ãããã«ãããŸãïŒ
react-native 0.62.0.rc-1 <-ãããã«ãããŸãïŒ
[email protected]
åããšã©ãŒ
ã»ã³ããªãŒã«ãã£ãŠãã£ãããããåããšã©ãŒã®å€ãã®çºçãæã€ïŒ https ïŒ
RN0.59.9ã®å Žå
RN0.55.4ã§ãåããšã©ãŒ
RN2.0.1ã§ãåãåé¡
'underlineColorAndroid'å°éå ·ãTextInputã«èšå®ãããããã€ãã£ãã¹ã¿ã€ã«ã§ãã¹ãŠã®ããã¹ãå ¥åã®èæ¯ãåé€ãããããªãã§ãã ããã
goto android \ app \ src \ main \ res \ values \ styles.xml
以äžã®ããã«å€æŽããŠãã ããïŒ
RN0.61.5ã§ãåã
æåãã¹ãã¯éåžžã«è¡ãåœããã°ã£ããã§ããããšãããã£ãã®ã§ãäžèšã§å ±åãããŠããã·ããªãªã®ããã€ããèªåçã«ãã¹ãããã³ã³ããŒãã³ããäœæããŸããã 以äžã®ã³ã³ããŒãã³ãããããŸãã ããªãã¯ããããã®ä»äºãããããã«ã©ããã«ãããã¬ã³ããªã³ã°ããå¿ èŠããããŸãã
ãããè¡ããšã@ Hopdingã«ãã£ãŠææ¡ãããŠããããã«ãstyles.xmlã®AppThemeã«ä»¥äžãè¿œå ããã ãã§ããããšãããããŸããã
<item name="android:editTextBackground"><strong i="8">@android</strong>:color/transparent</item>
ä»ã«äœãå¿ èŠãªãã
underlineColorAndroid
èšå®ãåé¿ããå¿ èŠã¯ãªãã£ãã®ã§ãReactNativeãããã©ã«ãã§èšå®ããããã«ãªã£ãã®ã¯åé¡ã§ã¯ãããŸããã§ããããã®ä¿®æ£ã®äž»ãªæ¬ ç¹ã¯ãçµæãšããŠããã£ã³ã°ã倱ãããããã«TextInputsã®ã¹ã¿ã€ã«ãå€æŽããå¿ èŠãããããšã§ãããŸããå®éã®äžç·ã®åäœã倱ãããŸããããã¯ãåžžã«ãééçãã«èšå®ããŠãããããã¡ãªããããããŸãã iOSãšã®äžè²«æ§ãä¿ã€ããã å¿ èŠã«å¿ããŠã
onFocus
ãšonBlur
ãç£èŠããã©ãããŒã³ã³ããŒãã³ããäœæããç¬èªã®äžç·ãä»ããããšãã§ããŸããReactNativeã®ç§ã®ããŒãžã§ã³ã¯0.57.3ã§ã
ãã¹ãã³ã³ããŒãã³ãã䜿çšããŠèŠã€ãããã®ä»ã®äºé ã¯æ¬¡ã®ãšããã§ãã
- äœã¹ããã¯ã®Androidã¿ãã¬ããããã€ã¹ã§ã¯ãã¯ã©ãã·ã¥ããŸã£ããåŒãèµ·ããããšãã§ããŸããã§ããã ãã ããAndroid7ãå®è¡ããŠããSamsungS6 Edgeé»è©±ã§ã¯ãåçŸããã®ã¯éåžžã«ç°¡åã§ããããããèªçºããã«ã¯ãããé«éãªããã€ã¹ãå¿ èŠãªã¬ãŒã¹æ¡ä»¶ããããšæããŸãã
- ããã¹ãå ¥åãã¹ã¯ããŒã«ããŠãéãã¯ãªããScrollViewã䜿çšããªããŠãåé¡ãç°¡åã«åçŸã§ããŸããã
- ããã¹ããå ¥åããå¿ èŠã¯ãããŸããã§ããã ãã©ãŒã«ã¹ãå€æŽããã ãã§ã¯ã©ãã·ã¥ãçºçããŸããã
- äžç·ãã©ã®è²ã«èšå®ããŠãéãã¯ãªãã
undefined
ã§ãã¯ã©ãã·ã¥ãçºçããŸããããRNã®ããã©ã«ãããéæãã«ãªã£ãŠãããããããããäºæ³ãããã§ãããã- ããªãã®æ°ã®TextInputãäžåºŠã«è¡šç€ºããããšã§ãç»é¢ã«10åã ãã§ã¯ãªãã100åã®ã¯ã©ãã·ã¥ãããéãçºçãããšããéããçãŸããŸããã
displayForMs: 0
ã¯ã©ãã·ã¥ãåçŸã§ããŸãããã¹ãäžã«ã¶ãã¶ãããããªãå Žåã¯ã
adb logcat
ã®åºåããã£ããã£ããŠãã³ã³ããŒãã³ãã«ãã£ãŠçæãããã³ã³ãœãŒã«ã¡ãã»ãŒãžãšã¯ã©ãã·ã¥ã¬ããŒããæ¢ãããšãã§ããŸãããããç§ã®ãã¹ãã³ã³ããŒãã³ãã§ãã ãã¹ããã©ã¡ãŒã¿ã¯ãéåžž30ç§ä»¥å ã«ã¯ã©ãã·ã¥ãåŒãèµ·ããããã«èšå®ãããŠããŸãã
/** * A test component to reproduce the crash reported at * https://github.com/facebook/react-native/issues/17530 */ import * as React from "react"; import { View, ScrollView, TextInput, Text, StyleSheet } from "react-native"; // These are the test parameters const params = { underlineColors: ["red", undefined, "transparent", "rgba(0, 0, 0, 0)"], // The colors to test numberOfInputs: 100, // How many TextInput to render at a time focusIntervalMs: 200, // How often to change focus between them displayForMs: 3000, // How long to display them (set to 0 for indefinite) delayDisplayForMs: 10, // How long to delay between displays withScrollView: false // Whether to use a ScrollView }; const testText = index => `Testing underlineColor = ${params.underlineColors[index] || "undefined"}`; class AndroidTextInputTest extends React.Component{ state = { underlineColorIndex: 0, showInputs: true, startKey: 0 }; mounted = false; focusInterval = undefined; textInputRefs = undefined; focussedInputIndex = 0; componentDidMount() { console.log(`Testing with params = `, JSON.stringify(params)); this.mounted = true; setTimeout(this._showInputs, params.delayDisplayForMs); setInterval(this._focusAnInput, params.focusIntervalMs); } componentWillUnmount() { clearInterval(this.focusInterval); this.mounted = false; } _focusAnInput = () => { if (this.mounted && this.textInputRefs) { if (this.focussedInputIndex >= this.textInputRefs.length) { this.focussedInputIndex = 0; } const textInputRef = this.textInputRefs[this.focussedInputIndex]; const textInput = this.refs[textInputRef]; if (textInput) { this.focussedInputIndex++; this.refs[textInputRef].focus(); } } }; _showInputs = () => { if (this.mounted) { console.log(testText(this.state.underlineColorIndex)); this.setState({ showInputs: true }); if (params.displayForMs) { setTimeout(this._unshowInputs, params.displayForMs); } } }; _unshowInputs = () => { this.focussedInputIndex = 0; this.textInputRefs = undefined; if (this.mounted) { let next = this.state.underlineColorIndex + 1; if (next === params.underlineColors.length) { next = 0; } this.setState({ underlineColorIndex: next, showInputs: false, startKey: this.state.startKey + params.numberOfInputs }); setTimeout(this._showInputs, params.delayDisplayForMs); } }; render() { const textInputs = []; const { underlineColorIndex } = this.state; const underlineColor = params.underlineColors[underlineColorIndex]; const refs = []; if (this.state.showInputs) { for (let i = 0; i < params.numberOfInputs; i++) { const key = this.state.startKey + i + ""; refs.push(key); textInputs.push( <TextInput ref={key} key={key} placeholder={key} underlineColorAndroid={underlineColor} style={styles.textInput} /> ); } if (!this.textInputRefs) { this.textInputRefs = refs; } } return ( <View style={styles.mainView}> <Text>{testText(underlineColorIndex)}</Text> {params.withScrollView ? ( <React.Fragment> <Text>With ScrollView</Text> <ScrollView>{textInputs}</ScrollView> </React.Fragment> ) : ( <React.Fragment>{textInputs}</React.Fragment> )} </View> ); } } const styles = StyleSheet.create({ mainView: { flex: 1, alignItems: "center" }, textInput: { backgroundColor: "white", margin: 5, width: 300 } }); export default AndroidTextInputTest;
ãããç§ã®ããã«ãããä¿®æ£ããããšã確èªã§ããŸãïŒ
ç§ã®ãã¹ãã³ã³ããŒãã³ããšææ¡ããã解決çãããªãã®ããã«åããŠããããã§ã@gagangoku
ã³ã³ããã¹ãã§ãããèŠãã人ã®ããã«ããªã³ã¯ã¯ããã«ãã
ãããããããªãã¯ãã®ãªã³ã¯ãããªãã®ã³ã¡ã³ãã«è¿œå ããã®ã«åå芪åã§ãããã
@ glenn-axsyããã®ä¿®æ£ã¯ç§ã®ããã«åããŸããïŒãã¹ãã³ã³ããŒãã³ãðððãããããã«ïŒããããç§ã¯éäžã§å¥ã®å€±ãããéãå©ãããããããªãããã€ãã®åé¡ã«ééããŸããïŒ
ã¹ãã©ãã·ã¥ç»é¢ã¢ã¯ãã£ããã£ãè¿œå ãããšãã«éçºè
ãç¯ããééãã®ããã«ãç§ã®AppThemeãAndroidManifest.xml
ãã¡ã€ã«ã§äžé©åã«ãªãŒããŒã©ã€ããããŠããŸããã AppThemeãå®éã«äœ¿çšãããŠããããšãä¿®æ£ããŠç¢ºèªãããšïŒããšãã°ãããã©ã«ãã®ããã¹ãã®è²ãå€æŽããŠã¢ããªã§è¡šç€ºããããšã«ããïŒãä¿®æ£ã¯å®éã«æ©èœããŸããã
ã©ããããããšãããããŠå¹žéãç¥ããŸãïŒ
ããã¯å芧äŒã䜿çšããŠç§ã«èµ·ãããŸãã ãã®ã³ãã³ããå®è¡ããŸãã
sudo expo start -c
ãããŠåé¡ã¯ãªããªããŸããã
@HakimAsaãã¹ãã³ã³ããŒãã³ãã䜿çšããŠãå®éã«
圌ãã®å¥åŠãªããšã¯ãã³ãŒãããã®åé¡ãªãã§1ãæéæ©èœããŠããããšã§ãã ããããå€æŽãç¹°ãè¿ããªããŒãããåŸãæšæ¥åé¡ãçºçããŸãã...ãšã«ããç§ã¯ããªãã®ææ¡ãè©ŠããŠã¿ãŸã@ glenn-axsy
ç§ã®å Žåã renderItem
ã<TextInput />
è¿ããšãFlatListå
ã§çºçããŠããŸããã ã ããç§ã¯<><TextInput /></>
è¿ãããšã§ãã®åé¡ã解決ããŸãã
@MahmoudHemaidåé¡ãåçŸããã®ã¯éåžžã«é£ãããããå®éã«ã¯è§£æ±ºããŠããªãå¯èœæ§ããããŸãã 詳现ã¯ãã¡ãã
android.graphics.drawable.Drawable $ constantstateãç»åãã¯ãªãã¯ããŠãããšãã«ååŸããnullåç §ãšã©ãŒã§newdrawableãå³ç«¯ã«é 眮ã ãããŠããã®ç»åã¯ãã°ã«ãã¿ã³ã®ããã«æ©èœããŸããã RN0.61.2ã䜿çšããŠããŸãã 誰ããç§ãåé¡ã解決ããã®ãæäŒã£ãŠãã ããã ããã¯ã¹ã¿ã³ãã¢ãã³apkã§ã®ã¿çºçããŸã
@ glenn-axsy https://github.com/facebook/react-native/issues/17530#issuecomment -504044357
ãããè¡ããšã@ Hopdingã«ãã£ãŠææ¡ãããŠããããã«ãstyles.xmlã®AppThemeã«ä»¥äžãè¿œå ããã ãã§ããããšãããããŸããã
<item name="android:editTextBackground"><strong i="9">@android</strong>:color/transparent</item>
https://github.com/facebook/react-native/pull/27782#issuecomment -575753501
æãåçŽãªäŸã¯ãåã«äœæããããšã§ã
EditText
nullãæã€AttributeSet
ãªãïŒ0ïŒããã©ã«ãã®ã¹ã¿ã€ã«å±æ§ãïŒ
<strong i="18">@Override</strong>
protected EditText createDummyEditText() {
return new EditText(getThemedContext(), null, 0);
}
ReactTextInput
ã¯ã EditText
ç¬èªã®ã€ã³ã¹ã¿ã³ã¹ãæäŸããããµãã¬ãŒã¶ãŒã«ãã£ãŠãªãŒããŒã©ã€ããããå ŽåããããŸãã
EditText
androidã³ã³ã¹ãã©ã¯ã¿ãŒïŒ
public class EditText extends TextView {
public EditText(Context context, AttributeSet attrs, int defStyleAttr) {
this(context, attrs, defStyleAttr, 0);
}
}
View
ã³ã³ã¹ãã©ã¯ã¿ãŒãåŒã³åºããŸãïŒ docs ïŒ
調æ»ãç¶ããŸãã ããããšã
ãã@ glenn-axsyãç§ã¯ããã«äœæéãèŠåŽããŠããã®ã§ãããªããç§ãå©ããŠãããããšãæ¬åœã«é¡ã£ãŠããŸãã ç§ã¯ç§ã®Androidæºåž¯é»è©±ã§ããªãã®AndroidTextInputTestã䜿çšããŠããŸãã ãããéèŠãªå Žåã¯ãTypescriptã䜿çšããŠReact Nativeãå®è¡ããŠãããExpoãä»ããŠå®è¡ããŠããŸããããã¯ãEditTextã¿ã€ãã®ãã®ããªãããšãæå³ããŸãã
package.jsonã§ãã€ãã£ãã«åå¿ãã= "react-native"ïŒ "^ 0.61.4"
ç§ã¯ãã©ã¡ãŒã¿ã䜿çšããŸããïŒ
const params = {
underlineColorsïŒ["red"ãundefinedã "transparent"ã "rgbaïŒ0ã0ã0ã0ïŒ"]ã//ãã¹ãããè²
numberOfInputsïŒ100ã//äžåºŠã«ã¬ã³ããªã³ã°ããTextInputã®æ°
focusIntervalMsïŒ200ã//ãããã®éã§ãã©ãŒã«ã¹ãå€æŽããé »åºŠ
displayForMsïŒ3000ã//ãããã衚瀺ããæéïŒäžå®ã®å Žåã¯0ã«èšå®ïŒ
delayDisplayForMsïŒ10ã//衚瀺éã®é 延æé
withScrollViewïŒfalseã// ScrollViewã䜿çšãããã©ãã
};
ãããŠããä»®æ³ã¡ãœãããåŒã³åºãããšããããååŸããåã®ç§ã®åºåã¯æ¬¡ã®ãšããã§ãã
params = {"underlineColors"ïŒ["red"ãnullã "transparent"ã "rgbaïŒ0ã0ã0ã0ïŒ"]ã "numberOfInputs"ïŒ100ã "focusIntervalMs"ïŒ200ã "displayForMs"ã䜿çšãããã¹ãïŒ 3000ã "delayDisplayForMs"ïŒ10ã "withScrollView"ïŒfalse}
calendarVisibleã®ãã©ã¡ãŒã¿ãŒã¯trueã§ãããç¶æ ã¯trueã§ãã
underlineColor = redã®ãã¹ã
underlineColor = undefinedã®ãã¹ã
underlineColor =ééã®ãã¹ã
underlineColor = rgbaïŒ0ã0ã0ã0ïŒã®ãã¹ã
underlineColor = redã®ãã¹ã
underlineColor = undefinedã®ãã¹ã
underlineColor =ééã®ãã¹ã
ãããã£ãŠãããããã®ç§ã®è³ªåã¯ããããã®ãã©ã¡ãŒã¿ãŒãšã¯ã©ãã·ã¥åã«è¡šç€ºãããåºåã䜿çšããŠãã¢ããªã®åé¡ã蚺æããã«ã¯ã©ãããã°ããããšããããšã§ãã
å©ããŠãããŠããããšãã
@ucheNkadiCodeããã¯åé¡ããã°ããåçŸããããã®ãã¹ãã§ããã解決çã§ã¯ãããŸããã 解決çã¯
<item name="android:editTextBackground"><strong i="7">@android</strong>:color/transparent</item>
@ucheNkadiCodeããã¯åé¡ããã°ããåçŸããããã®ãã¹ãã§ããã解決çã§ã¯ãããŸããã 解決çã¯
<item name="android:editTextBackground"><strong i="8">@android</strong>:color/transparent</item>
@sunnylqmç§ã¯
ç§ã¯æ¬¡ã®ãããªTextInputã䜿çšããŸãïŒ
TextInput
ref = {key}
key = {key}
placeholder = {key}
underlineColorAndroid = {underlineColor}
style = {styles.textInput}
ããããšãããããŸãã
@ucheNkadiCode
ããããäžåã®å Žåããã®ãããªèšå®ãå€æŽããã«ã¯ãæåã«ã€ãžã§ã¯ãããå¿
èŠããããŸã
@ucheNkadiCode
ããããäžåã®å Žåããã®ãããªèšå®ãå€æŽããã«ã¯ãæåã«ã€ãžã§ã¯ãããå¿ èŠããããŸã
ãããããã¯åœç¶ã®ããšãªããåé¡ã«ãªãã ããã ç§ã®reactNativeã¢ããªãéçºã®æ©ã段éã§æé€ãã代åãæããããããŸããã ReactNativeã䜿ãç¶ããããã®è§£æ±ºçãèŠã€ããããšæã£ãŠããŸãã
ãååããã ãããããšãããããŸã
@ axsy-dev @ucheNkadiCode
ç§ã®ã³ã¡ã³ãã¯ãã®æ¹åã§æ©èœããŠããããã«ãªã¯ãšã¹ãã§ãããä¿®æ£ããŠã TextInput
å°éå
·underlineColorAndroid
é¢é£ããåé¡ãåé¿ããŸããã ReactNativeã¯ããã°ã©ã çãªæ¹æ³ã§ããŒããèšå®ããŸã...ãã®åé¡ã解決ã§ããªãã£ããããã³ã¡ã³ãã確èªããŠãã£ãŒãããã¯ããéããã ãããçŸåšãä»ã®ãã«ãªã¯ãšã¹ãã«åãçµãã§ããŸãã ããããšã
ç§ã¯å®éã«reactnative ReactTextInput
ã¡ãœãããæžãçŽãããšã§ãã®åé¡ã解決ããããšãã§ããŸãã
<strong i="12">@Override</strong>
protected EditText createDummyEditText() {
return new EditText(getThemedContext(), null, 0);
}
ããããããã¯getThemedContext()
EditTextã³ã³ããŒãã³ãã«æž¡ãããã¹ã¿ã€ã«ãç¡å¹ã«ããã ãã§ã
ããã«ãã¹ã¿ãã¯ã¯ããã®ãšã©ãŒãReactEditText.onTouchEvent
ã«ãã£ãŠããªã¬ãŒãããããšã瀺ããŠããããããŠãŒã¶ãŒãTextInput
ã³ã³ããŒãã³ãã«è§Šãããšã
ç§ã®ã³ã¡ã³ãã¯ãã®æ¹åã§æ©èœããŠããããã«ãªã¯ãšã¹ãã§ãããä¿®æ£ããŠã
TextInput
å°éå ·underlineColorAndroid
é¢é£ããåé¡ãåé¿ããŸããã ReactNativeã¯ããã°ã©ã çãªæ¹æ³ã§ããŒããèšå®ããŸã...ãã®åé¡ã解決ã§ããªãã£ããããã³ã¡ã³ãã確èªããŠãã£ãŒãããã¯ããéããã ãããçŸåšãä»ã®ãã«èŠä»¶ã«åãçµãã§ããŸããç§ã¯å®éã«reactnative
ReactTextInput
ã¡ãœãããæžãçŽãããšã§ãã®åé¡ã解決ããããšãã§ããŸãã<strong i="12">@Override</strong> protected EditText createDummyEditText() { return new EditText(getThemedContext(), null, 0); }
ããããããã¯
getThemedContext()
EditTextã³ã³ããŒãã³ãã«æž¡ãããã¹ã¿ã€ã«ãç¡å¹ã«ããã ãã§ãããã«ãã¹ã¿ãã¯ã¯ããã®ãšã©ãŒã
ReactEditText.onTouchEvent
ã«ãã£ãŠããªã¬ãŒãããããšã瀺ããŠããããããŠãŒã¶ãŒãTextInput
ã³ã³ããŒãã³ãã«è§Šãããšã
@ axsy-dev @ fabriziobertoglio1987ã ãããã£ãŠãReactEditTextã䜿çšããŠãããžã§ã¯ããã£ã¬ã¯ããªã«èŠã€ããããšãã§ããèŠçŽ ã¯ãããŸããããŸãããã£ã¬ã¯ããªã«.javaãã¡ã€ã«ããããŸããã ç§ã¯ReactNativeã§TypeScriptã䜿çšããŠããã®ã§ãå€ãã®node_modulesãé€ããŠããã¡ã€ã«ã®å€§éšåã¯.tsxãŸãã¯.tsã§ãã
æ®å¿µãªããããã€ãã£ãAndroidã¯äœ¿çšããŠããŸããã
@ucheNkadiCodeã䜿çšããŠããã解決ããã«ã¯ãã€ãžã§ã¯ãããå¿ èŠããããŸããããã§ãªãå Žåã¯ãreactnativeã§ãã®ã·ããªãªãåäœæãããã«ãªã¯ãšã¹ããèšè¿°ããŠãreact-nativeã«ããŒãžããŠãããåŸã§expoãå®è¡ããŸãã
@ucheNkadiCode Expoã䜿çšããŠããªãã®ã§ã¯ãªãããšæããŸããã @ sunnylqmã¯åœŒãäœã«ã€ããŠè©±ããŠããããç¥ã£ãŠãããã
å芧äŒã§ãåãåé¡ã«çŽé¢ããŸããã
ç§ãè©ŠããïŒwatchman watch-del-all && expo r -c
ããããä»ã§ãè¯ããã¥ãŒã¹ã§ãã
ç§ã¯åãåé¡ã«çŽé¢ããŠããŸããTextInputãããã¹ãã«å€æŽãããšæ¶ããŸãã
2幎åã®ãã®ã³ã¡ã³ãã¯ãŸã æå¹ã§ãã
FlatListå ã§ã¬ã³ããªã³ã°ããã
<TextInput>
ã«çµã蟌ã¿ãŸããã ããã<Text>
ã«çœ®ãæãããšãåé¡ã¯è§£æ¶ãããŸãã
ãã£ãã·ã¥ããªã»ãããããšç°¡åã«åœ¹ç«ã€ããã§ããããã¿ã³ãæ°åã¯ãªãã¯ãããšã¢ããªãåã³ã¯ã©ãã·ã¥ããŸãã
ç§ã®ãã¹ãã³ã³ããŒãã³ãã䜿çšãã@diegobostonãã¹ãã§ã¯ãFlatListãªãã§ãããåçŸã§ããŸãã ãã¹ãã³ã³ããŒãã³ããšåé¿ç/解決çã¯ãããã®ç§ã®ã³ã¡ã³ãã«ãã
å
éšã§reactnative0.61ã䜿çšããexpoSDK37ã䜿çšããŠããŸãã
äœã®åé¡ããªãã£ãã®ã¯äžæè°ã§ããããã«ããŒãåèµ·åãããšçªç¶ãã®åé¡ãçºçããŸããã ãŸã ä¿®æ£ãããŠããŸãããïŒ
RN 0.62.2
+ Android
ããã§ãåãã§ãã
ãã®ãšã©ãŒã¯ãæ¬çªã¢ãŒãã§åŒã³åºãããŸãã
èšå®ããã¢ããªã®ãã£ãã·ã¥ãã¯ãªã¢ããããšã§åé¡ã¯è§£æ±ºããŸããããããã«å¯Ÿãã蚱容ã§ãã解決çãšã¯æããŸããã
ç§ã¯ãã®åé¡ã«åãçµã¿ãŸããããããŠããã¯ç§ã®çºèŠã§ãïŒåã®æçš¿ã¯ããã«ãããŸãïŒã
1ïŒ android:editTextBackground
ãšcolor/transparent
ãããŒãã«è¿œå ãããšãåé¡ãä¿®æ£ãããããšãããã£ãŠããŸã
<item name="android:editTextBackground"><strong i="10">@android</strong>:color/transparent</item>
2ïŒ ReactEditTextShadowNode
ã¡ãœããcreateDummyEditText
ã以äžã®ã³ãŒãã«å€æŽãããšãåé¡ãä¿®æ£ãããŸãïŒEditTextã®ãã¹ãŠã®ã¹ã¿ã€ã«ãç¡å¹ã«ããŠããããã§ãïŒ
<strong i="16">@Override</strong>
protected EditText createDummyEditText() {
return new EditText(getThemedContext(), null, 0);
}
ãã®åé¡ã«ã€ããŠã®ç§ã®ç解ã¯ãAndroidã§ã¯2ã€ã®æ¹æ³ã§ã¹ã¿ã€ã«ãèšå®ã§ãããšããããšã§ã
1ïŒhtmlèŠçŽ ãã¹ã¿ã€ã«ã®ãããªXMLãèšè¿°ããããããé©çšããŸã
2ïŒ EditText
ãŸãã¯View
ã³ã³ã¹ãã©ã¯ã¿ãŒãåŒã³åºããã³ã³ããã¹ãããã³ãã®ä»ã®å±æ§/ã¹ã¿ã€ã«ãæž¡ããŸãã
ReactEditText
ã¯createDummyEditText
ã䜿çšããŠEditText
ã€ã³ã¹ã¿ã³ã¹ãäœæããããã€ãã®ã¹ã¿ã€ã«ïŒããã£ã³ã°ãã¬ã€ã¢ãŠããªã©ïŒãå€æŽããŸãããããã¯ã¬ã€ã¢ãŠãïŒããã£ã³ã°ãããŒãžã³ïŒãšèæ¯è²ãªã©ã§ã¯ãããŸãããå®éããããã®ã³ãŒãè¡ãsetBackgroundTint
ããred
ãŸãã¯transparent
å€æŽããããšããŸããããæ©èœããŸããã§ãã...
以äžã®æ¹æ³ã§èæ¯è²ãå€æŽããŸã
æææ¥ã«ããäžåºŠsetBackgroundColor
ã¡ãœãããå€æŽããå®è¡æã«èæ¯è²ãéæã«èšå®ããŸã...ããããã®åé¡ã解決ããããã®æåã®æãããã«ãªããŸã
ã¹ã¿ãã¯ã¯createInternalEditText
倱æããŸã
/**
* May be overriden by subclasses that would like to provide their own instance of the internal
* {<strong i="9">@code</strong> EditText} this class uses to determine the expected size of the view.
*/
protected EditText createInternalEditText() {
return new EditText(getThemedContext());
}
createInternalEditText
ã¯å€±æããåã«åŒã³åºãããæåŸã®ã¡ãœããã§ãããã¹ã¿ãã¯ã®æ®ãã¯Android sdk OpenSourceã©ã€ãã©ãªããã®ãã®ã§ãããåââé¡ã®æ¬åœã®åå ã§ã¯ãããŸãã
android:editTextBackground
èšå®ããããšã¯ãåé¡ã®åå ãšãªã£ãŠããããã©ã«ãããŒãã®ããã€ãã®ã¢ã€ãã å€ãä¹ãè¶ããŠããå¯èœæ§ããããŸãã ãã®åé¡ã¯ãããŒããå«ãgetThemedContext
ãæž¡ãã³ã³ã¹ãã©ã¯ã¿ãŒã«é¢é£ããŠããŸã
<item name="android:editTextBackground"><strong i="17">@android</strong>:color/transparent</item>
ãã®ããã Reactãã³ã³ããã¹ããåŠçããæ¹æ³ã§ãœãªã¥ãŒã·ã§ã³ãæ€çŽ¢ããå¿ èŠããããšæã
ããã±ãŒãžã£ãåèµ·åããŠãã£ãã·ã¥ãã¯ãªã¢ãã人ã¯ç§ã®ããã«åããïŒ
ããããããã¯äžæçãªè§£æ±ºçã§ããã©ãããã°ãã®ããŒããã³ããä¿®æ£ã§ããŸããïŒ
ããã°ã©ã ã§Javaã§èæ¯è²ãéæã«èšå®ããããšããŸããããããã§ãã©ã³ã¿ã€ã ãšã©ãŒãçºçãã以äžã®ã³ãŒããä¿¡ããããŸã
<item name="android:editTextBackground"><strong i="6">@android</strong>:color/transparent</item>
ããã®ããžãã¯ããªãŒããŒã©ã€ãããã ãã§ã
ããã¯æããã«ã¹ã¿ãã¯ã®åé¡ã®åå ã§ã
ãã®ã¡ãœããã¯ãEditTextã®ã¹ã¿ã€ã«ãèšå®ãã責任ããããŸãã
åé¡ã¯ãå
ã®åé¡ã¹ã¿ãã¯ã®ãã°ãç°ãªããæ·»ä»ã®ãã¹ãã±ãŒã¹ãšã¯ç¡é¢ä¿ã®ããã«èŠããããšã§ãã 以äžã®ã¹ã¿ãã¯ã¯ReactEditText.onTouchEvent
ããçºçããŸãããããã¯ããŠãŒã¶ãŒãTextInput
觊ããŠããããšãæå³ãããšã©ãŒãããªã¬ãŒãããŸãã
å
ã®ãã°ãšã©ãŒ
java.lang.NullPointerException:
tempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)' on a null object reference at
android.graphics.drawable.DrawableContainer$DrawableContainerState.getChild(DrawableContainer.java:888) at
android.graphics.drawable.DrawableContainer.selectDrawable(DrawableContainer.java:466) at
android.graphics.drawable.StateListDrawable.onStateChange(StateListDrawable.java:104) at
android.graphics.drawable.Drawable.setState(Drawable.java:735) at
android.graphics.drawable.DrawableWrapper.onStateChange(DrawableWrapper.java:331) at
android.graphics.drawable.Drawable.setState(Drawable.java:735) at
android.graphics.drawable.LayerDrawable.onStateChange(LayerDrawable.java:1488) at
android.graphics.drawable.Drawable.setState(Drawable.java:735) at
android.view.View.drawableStateChanged(View.java:18002) at
android.widget.TextView.drawableStateChanged(TextView.java:4097) at
android.view.View.refreshDrawableState(View.java:18071) at
android.view.View.setPressed(View.java:8543) at
android.view.View.setPressed(View.java:8521) at
android.view.View.onTouchEvent(View.java:11218) at
android.widget.TextView.onTouchEvent(TextView.java:8467) at
com.facebook.react.views.textinput.ReactEditText.onTouchEvent(ReactEditText.java:150)
ãã®ä»ã®ã¿ã€ãã®ãšã©ãŒhttps://github.com/facebook/react-native/issues/17530#issuecomment-376917781
ãã®ä»ã®ãã°ãšã©ãŒ
èŽåœçãªäŸå€ïŒjava.lang.NullPointerExceptionïŒandroidã®nullãªããžã§ã¯ãåç
§ã§ä»®æ³ã¡ãœãã 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable $ ConstantState.newDrawableïŒandroid.content.res.ResourcesïŒ'ãåŒã³åºãããšããŸãã.graphics.drawable.DrawableContainer $ DrawableContainerState.createAllFuturesïŒDrawableContainer.java:875ïŒat android.graphics.drawable.DrawableContainer $ DrawableContainerState.getOpacityïŒDrawableContainer.java:1158ïŒat android.graphics.drawable.DrawableContainer.getOpacityïŒ ïŒ433ïŒandroid.graphics.drawable.InsetDrawable.getOpacityïŒInsetDrawable.java:258ïŒat android.view.View.computeOpaqueFlagsïŒView.java:16791ïŒat android.view.View.setBackgroundDrawableïŒView.java:21710ïŒ android.view.View.setBackgroundïŒView.java:21603ïŒatandroid.view.Viewã
å察åŽã§ã¯ã httpsïŒ //github.com/facebook/react-native/issues/17530#issuecomment -504044357ã蚱容ã§ããäŸã§ãããã©ãããèªåã
ãã®è°è«ã®èª°ããé©åãªèª¿æ»ãè¡ãããã®åé¡ã解決ãããšç¢ºä¿¡ããŠããŸãã ã©ããããããšãããããŠå¹žéãïŒ ïŒã¹ãã€ãªãŒïŒ
çããããnpminstallããããäžåºŠå®è¡ããŠã¿ãŠãã ããã ããã¯ç§ã®ããã«åããã
<item name="android:editTextBackground"><strong i="5">@android</strong>:color/transparent</item>
ãè¿œå ããããšããŸããããããã§ã¢ããªãã¯ã©ãã·ã¥ããªããªããŸããããããã¹ãããã¯ã¹ã倧å°ã®éã§ç¹æ»
ãç¶ããŠäœ¿çšã§ããªããªããŸãããä»ã®èª°ãããããæã£ãŠããŸãããïŒ
ç§ã®å Žåãstyled-componentsã䜿çšããå°éå ·ã®ååããrightãã«èšå®ããŸãããããã¯ç¹å¥ãªããšã ãšæããŸãããisRightãã«å€æŽãããšãåé¡ã解決ããŸããã
ãªãªãŒã¹ãã«ããåãããã®ãšã©ãŒãèŠãããšããªããã®apkã§ãã¹ãããŠãã ãã
å ã®ã³ã¡ã³ãã¯ãåæãã°ã¬ããŒããéããŠåŸãããåé¡ãå ±åããŠãããéçºäžã®ãšã©ãŒã§ã¯ãããŸãããç§ãã¡ã¯éäžãç¶ããå¿ èŠããããšæããŸãã
ã¢ããªã§æ©èœãããã€ã³ãã®äž¡æ¹ãšãããããè©Šãããšãã§ããŸãã
https://github.com/facebook/react-native/pull/24183ãããããäžåºŠãããã°ããããšããŠããŸãã
Androidãããžã§ã¯ãã§https://issuetracker.google.com/issues/37068452ãéããŠããé¢é£ããåé¡ãããããã§ã
- getConstantStateïŒïŒããªãŒããŒã©ã€ãããªãã«ã¹ã¿ã Drawableå®è£ ãäœæããŸãã
- ã«ã¹ã¿ã ãããŒã¢ãã«ã®ã€ã³ã¹ã¿ã³ã¹ãåãšããŠãLayerDrawableã€ã³ã¹ã¿ã³ã¹ãäœæããŸãã
- LayerDrawableã§mutateïŒïŒãåŒã³åºããŸãã
Drawable dummyDrawable = new Drawable() {
<strong i="12">@Override</strong>
public void draw(Canvas canvas) {
canvas.drawColor(Color.RED);
}
<strong i="13">@Override</strong> public void setAlpha(int alpha) {}
<strong i="14">@Override</strong> public void setColorFilter(ColorFilter cf) {}
<strong i="15">@Override</strong> public int getOpacity() { return 0; }
};
LayerDrawable layerDrawable = new LayerDrawable(new Drawable[] { dummyDrawable });
layerDrawable.mutate();
ãã®å Žåãã©ã³ã¿ã€ã ãšã©ãŒã¯ReactEditText
ïŒ AppCompatEditTextããç¶æ¿ïŒãããã®è¡ã§ããªã¬ãŒãããŸã
https://github.com/facebook/react-native/issues/17530#issuecomment -615131077
<TextInput style={styles.input} />
ã¯ãJavaScriptã©ã³ã¿ã€ã ããAndroidã«ReactNativeBridgeãä»ããŠJSONãšããŠæ
å ±ãéä¿¡ããŸããAndroidJavaAPIã¯ããã®æ
å ±ã䜿çšããŠView
ã€ã³ã¹ã¿ã³ã¹ãäœæããç»é¢ã«è¡šç€ºïŒè¡šç€ºïŒããŸãã
Context
ãªããžã§ã¯ããView
ã³ã³ã¹ãã©ã¯ã¿ãŒã«æž¡ãããã®<TextInput />
ã®deaultã¬ã€ã¢ãŠããèšããŸããŸãããã®åŸã underlineColorAndroid
ãããªå°éå
·ãå€æŽãããã³ã«ãããšãã°ãç¹å®ã®AndroidAPIã¡ãœãããåŒã³åºããŸãã setUnderlineColorAndroid("red")
ãšAndroid APIãã <TextInput />
äžç·ã®è²ã®æŽæ°ãåŠçããŸãã
37068452ãã©ã³ã¿ã€ã ãåŒãèµ·ãããŠããå ŽåãããããunderlineColor
å€æŽããããšã«ããã mutating()
BackgroundDrawable
underlineColor
ã«ãªãå¿
èŠããããŸããããšã©ãŒã¯View
ã³ã³ã¹ãã©ã¯ã¿ãŒã§ããªã¬ãŒãããŸãã Context
ãæž¡ããŸãã
Androidã¹ã¿ãã¯ã®ãããã°ãè©Šã¿ãŸãããæåã«ãçŸåšã®äŸãæå°åçŸå¯èœäŸã«å€æãããã°ã®åçŸã«äžå¯æ¬ ã§ã¯ãªãããããã£ãåé€ããããšããŸãã
æå°åçŸæ§ã®äŸãäœæããããšãã§ããŸããã
ãã®åé¡ã¯ãTextInputããŒã®å°éå
·ãåå ã§çºçã
ããŒpropã䜿çšããŠå€æ°ã®TextInputã³ã³ããŒãã³ããåã¬ã³ããªã³ã°ãããšãã©ã³ã¿ã€ã ãšã©ãŒãçºçããŸãã
TextInput
ã®æ°ã¯ãã¯ã©ãã·ã¥ãããªã¬ãŒããããã«éèŠãªããã§ãã
// Does not crash after testing for 5 minutes
for (let i = 0; i < 5; i++) { ..
// Crashes after 20 seconds
for (let i = 0; i < 100; i++) { ..
// Crashes after 1 second
for (let i = 0; i < 1000; i++) { ..
TextInput
ããŒãããããåé€ããŠããã¯ã©ãã·ã¥ã¯åçŸãããŸããã 調æ»ããŠä¿®æ£ãè©Šã¿ãŸãã ãã®äŸãå®è¡ããŠåçŸããŸãã
import * as React from "react";
import { View, TextInput } from "react-native";
class App extends React.Component{
state = { startKey: 0 };
componentDidMount() {
this.interval = setInterval(this.updateKey, 3000);
}
componentWillUnmount() {
clearInterval(this.interval);
}
updateKey = () => {
this.setState({
startKey: this.state.startKey + 100
});
};
render() {
const textInputs = [];
for (let i = 0; i < 100; i++) {
const key = (this.state.startKey + i).toString();
console.log("key", key);
// REMOVE KEY PROP TO FIX THIS
textInputs.push(
<TextInput key={key} />
);
}
return (
<View>
{ textInputs }
</View>
);
}
}
export default App;
åãåé¡ããããªãã®å ŽåãFlatListã§åçŸã§ããdata
å«ãå°éå
·key
ã index
ãŸãã¯id
ãã®ãããª[{ key: "1"}, {key: "2"}, .. {key: "5000"}]
ãèªåçã«key
ããªã¹ãã«äœ¿çšãããã©ã³ã¿ã€ã ãçºçããŸãã ãããã®ããŒãdata
é
åããåé€ãããšããšã©ãŒãä¿®æ£ãããèªåãã£ãã·ã¥ãåé€ãããŸãã
import * as React from "react";
import { Text, FlatList, View, TextInput } from "react-native";
class App extends React.Component{
state = { startKey: 0 };
componentDidMount() {
this.interval = setInterval(this.updateKey, 3000);
}
componentWillUnmount() {
clearInterval(this.interval);
}
updateKey = () => {
this.setState({
startKey: this.state.startKey + 100
});
};
render() {
const textInputs = [];
for (let i = 0; i < 5000; i++) {
const notKey = (this.state.startKey + i).toString();
console.log("key", notKey);
// REMOVE KEY OR ID FIELD TO FIX THIS
// replacing notKey with key will trigger the runtime
textInputs.push(
{ notKey }
);
}
return (
<FlatList
data={textInputs}
renderItem={({item}) => <TextInput value={"testing"} />}
/>
);
}
}
export default App;
ãã®åé¡ã¯ããã®ã³ãŒãè¡ãåå ã®ããã§ãã ãã®è¡ã«ã³ã¡ã³ããä»ããŠconst key = 500;
眮ãæããŸãããããšã©ãŒã¯åçŸãããŸããã§ããã
äŸãšããŠã keyExtractor(item, ii)
ãšitem = {"key":"450"}
ã ii = 50
ãããæ»ãå€key = 450
ã¯ã¯ã©ãã·ã¥ãåŒãèµ·ãããŸããããããæ¬åœã®åå ã§ã¯ãªããšæããŸãããããŒãåé¡ãåŒãèµ·ãããŠããããšã瀺ããŸãã ããããã調ã¹ãŠãããŸãã ç§ã¯ä»äºãæ¢ããŠããŸãã ã©ããããããšãã è¯ãé±æ«ãã
| ã©ã³ã¿ã€ã ãã|
|ïŒ-------------------------ïŒ|
| |
| ã©ã³ã¿ã€ã ãªã|
|ïŒ-------------------------ïŒ|
| |
@ fabriziobertoglio1987åæ§ã®çµè«ããããŸãhttps://github.com/facebook/react-native/issues/17530#issuecomment -573934341ã€ãŸããç·šéããã¹ãã®åããŠã³ã/ã€ã³ã¹ã¿ã³ã¹åã«é¢é£ããŠããŸãã åœæãçç±ããªããšæãããã®ã«ããªãtextinputãåäœæ/åã€ã³ã¹ã¿ã³ã¹åãããã®ãç解ã§ããŸããã§ããã ããŒãåå ã®ããã§ãã
ãããããšã©ãŒãã¹ããŒãããŸã
ããã§ãé
åmDrawableFutures
ã¯nullã§ã¯ãããŸãããããã®åèŠçŽ ã®äžéšãnullã§ããå¯èœæ§ããããŸãã
mDrawableFutures
ã¯ä»ã®äººããã®ã¿è€è£œã§ããŸã
ã€ãŸããã¯ããŒã³ãäœæãããšãã¯nullã§ã¯ãããŸããã§ãããããã®åŸãåèŠçŽ ã®äžéšãç Žå£ãããŸããã
以äžã¯ç§ã®æšæž¬ã§ãïŒäž»èŠãªå°éå
·ã¯ãããã¹ãå
¥åã®ã·ã£ããŠããŒããæ§ç¯ããå·®åããã»ã¹ãããªã¬ãŒããŸãã ãããŠãããã»ã¹äžã«ãæç»å¯èœãªç¶æ
ãè€è£œãããŸãã ãã ãã競åç¶æ
/ã¹ã¬ããã»ãŒãã§ãªãæäœãããã䜿çšäžã«ãããŒã¢ãã«ç¶æ
ã®äžéšãç Žå£ãããå¯èœæ§ããããŸãã @ fabriziobertoglio1987
ã©ããããããšã@sunnylqmç§ã¯ã³ã©ãã¬ãŒã·ã§ã³ã®åãä¿¡ããŠãããããã€ãã®ä»äºãèŠã€ããããã«ãã®ãã«ãªã¯ãšã¹ããäžéžãããããšããŠããŸãã
ãã®åé¡ã¯ã key
ãšReact.PureComponentã䜿çšãããšãã«æž¡ãããããã€ãã®ããŒãã£ãã©ã¡ãŒã¿ãŒã«é¢é£ããŠãããšæããŸãã
確ãã«ããã®åé¡ã¯TextInput
ã³ã³ããŒãã³ãã䜿çšããŠããå Žåã«ã®ã¿çºçããŸãã äŸã§ã¯ã亀æã®ããã®TextInput
ãšText
ã§renderItem
ãã®åé¡ã解決ããŸã
<FlatList
renderItem={({item}) => <TextInput value={"testing"} />}
Text
ãšTextInput
䜿çšã®éãã¯ã const element
ãForwardRef
ãšTextInput
ã§ãã 以äžã®å Žåã TextInput
ã¯ãç¹å®ã®ããŒã«å°éãããšãã«ã©ã³ã¿ã€ã ãäœæããŸãã underlineColorAndroid="transparent"
ãåé€ããŸããããããã¯ãšã©ãŒã®åå ã§ã¯ãããŸãããã以äžã®ãã°ã«æ®ããŸããã
console.log("element", element);
//=> element <Text value="testing" />
//=> element <ForwardRef(TextInput) allowFontScaling={true} rejectResponderTermination={true} underlineColorAndroid="transparent" value="testing" />
TextInputã¯forwardRefãè¿ããŸã
JavaAPIã®ã¡ãœããã¯TextInput
javascript APIããåŒã³åºãããŠãããšæããŸããããã©ã¡ãŒã¿ãŒãæ¬ èœããŠãããããŒãã£ã§ãã ãããNPEã©ã³ã¿ã€ã ãšã©ãŒã®åå ã§ããå¯èœæ§ããããŸãããçç±ãç解ããããã«JS TextInputAPIã®ããããåŽé¢ã調æ»ããå¿
èŠããããŸãã
React
ã¡ã«ããºã ã¯key
ããããã®æ¯èŒã«åºã¥ããŠããããã key
ãããããåé¡ãåŒãèµ·ãããŠãããšæããŸããããŒããããã¡ã«ããºã ãååšããªãå Žåããã£ãã·ã¥ããããã®åŸãšã©ãŒã¯çºçããŸããã ã
ææ¥ãäžèšã®ã¡ãã»ãŒãžã§åç §ããã³ãŒãã«ãã¬ãŒã¯ãã€ã³ããèšå®ããããšã
å©ããŠãããŠããããšãã ãã«ãªã¯ãšã¹ããäžç·ã«äœæããŠããã®åé¡ãä¿®æ£ã§ããããšãé¡ã£ãŠããŸãã ããã°ãã¯ã ãã¡ããªãã£ãª
@sunnylqm
é·ãããŠèªãŸãªã
ãã®åé¡ãä¿®æ£ããããã«ãã«ãªã¯ãšã¹ããäœæããŠããŸãã ä¿®æ£ã¯ãšãŠãç°¡åã§ãã
ãã®åé¡ã¯ãEditTextã®åæåã§äœ¿çšãããããã©ã«ãã®BackgroundDrawableãåå ã§çºçããŸã
Drawableã¯ãç§ãã¡ã䜿çšããŠããããŒãã®Theme.AppCompat.Light.NoActionBar
ã§ãã Drawableã®å€æŽã¯ãreact-nativeinitã¹ã¯ãªããã䜿çšããŠreact-nativeandroidãããžã§ã¯ããåæåããããã«äœ¿çšããããã³ãã¬ãŒãxmlãã¡ã€ã«ãå€æŽããããšã§å®è¡ã§ããŸãã
androidããããã©ã«ãã§æäŸãããŠãããã®ã䜿çšããããã«ã¹ã¿ã ãããŒã¢ãã«ãäœæããŠãã¹ãŠã®ãããžã§ã¯ãã®åæåã«å«ããŸãã
<item name="android:editTextBackground"><strong i="18">@android</strong>:drawable/edit_text</item>
ãŸãã¯
<item name="android:editTextBackground">@drawable/custom_background_drawable</item>
ãã³ã°ããŒãžã§ã³
ç§ã¯sunnylqmãåŒçšããŸãhttps://github.com/facebook/react-native/issues/17530#issuecomment-660506001
以äžã¯ç§ã®æšæž¬ã§ãïŒäž»èŠãªå°éå ·ã¯ãããã¹ãå ¥åã®ã·ã£ããŠããŒããæ§ç¯ããå·®åããã»ã¹ãããªã¬ãŒããŸãã ãããŠãããã»ã¹äžã«ãæç»å¯èœãªç¶æ ãè€è£œãããŸãã ãã ãã競åç¶æ /ã¹ã¬ããã»ãŒãã§ãªãæäœãããã䜿çšäžã«ãããŒã¢ãã«ç¶æ ã®äžéšãç Žå£ãããå¯èœæ§ããããŸãã
ãã®ã©ã€ã³android:editTextBackground
ä¿®æ£ã誀ããŸããããã®è¡ã¯ReactNativeã§äœãããã®ã§ããããïŒ
1ïŒ AndroidManifest.xml
ã¯android:theme="@style/AppTheme"
å²ãåœãŠãŸã
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.awesomeproject">
<uses-permission android:name="android.permission.INTERNET" />
<application
android:name=".MainApplication"
android:theme="@style/AppTheme">
2ïŒ res/values/styles.xml
ã®AppTheme
ãå€æŽããŸã
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="android:textColor">#000000</item>
<item name="android:editTextBackground"><strong i="22">@android</strong>:drawable/edit_text</item>
</style>
</resources>
3ïŒ EditText
ã³ã³ã¹ãã©ã¯ã¿ãŒã¯super(context)
ãåŒã³åºããŸãã context
ãªããžã§ã¯ãã«ã¯ã layout
ãštheme
ïŒ AppTheme
ïŒãå«ãŸããŸãã
View
ã³ã³ã¹ãã©ã¯ã¿ãŒã¯ã context
ãªããžã§ã¯ãããã¹ã¿ã€ã«/ããŒã/ã¬ã€ã¢ãŠãæ
å ±ãååŸãããããã®ã¹ã¿ã€ã«ïŒxmlã¯htmlã®ãããªãã®ïŒã§EditText
ã€ã³ã¹ã¿ã³ã¹ãäœæãããããèšããŸããŠç»é¢ã«è¡šç€ºããŸãã
Androidã¯htmlã®ãããªxmlã䜿çšããŠéçãã¥ãŒãã¬ã³ããªã³ã°ããJavaã¯åçã³ã³ãã³ãã®ã¬ã³ããªã³ã°ã«äœ¿çšãããŸãïŒWebã®JavaScriptãªã©ïŒã
4ïŒ ReactNative
ã¯Context
APIã®äžã«æ§ç¯ãããŸããã1ã3ã®åããã¿ãŒã³ã䜿çšããŸãã
context
ãªããžã§ã¯ãã§ãã¥ãŒãåæåããJavaScriptã䜿çšããŠã context
ã€ã³ã¹ã¿ã³ã¹ãçŽæ¥å€æŽããã«ãAndroid APIãä»ããŠreact-native
ããªããžã䜿çšããŠåçãªå€æŽãè¡ããŸãã
| å€æŽå| åŸ| TextInputã¹ã¿ã€ã«ã®å°éå
·ã䜿çšããåŸ|
|ïŒ-------------------------ïŒ|ïŒ-------------------- -----ïŒ|ïŒ-------------------------ïŒ|
| | | |
åæåæã«EditTextã«äœ¿çšãããããã©ã«ãã®Drawableãå€æŽãããã«ãªã¯ãšã¹ãã
ããŒãTheme.AppCompat.Light.NoActionBarã®Drawableããã®åé¡ã®åå ã§ãããå¥ã®<strong i="27">@android</strong>:drawable/edit_text
ã¯ãç§ãã¡ã®ãã¶ã€ã³ã«ã¯é«ãããŸãã é«ãã芪ãããé«ãå Žåã芪ãã¥ãŒã¯ããã©ã«ãã®æç»å¯èœãªé«ãã«é©å¿ããŸãã ReactNativeã¯ãé«ããäœãããã©ã«ãã®ãããŒã¢ãã«ã䜿çšãããããmatch_parent
ã§èŠªãã¥ãŒã«é©åãããŠãããšæããŸãã
1ïŒãªãã·ã§ã³1-å¥ã®ããŒããããããŒã¢ãã«ãæ¢ã
2ïŒãªãã·ã§ã³2
Androidãããžã§ã¯ãã§å©çšå¯èœãªãã®ã«åºã¥ããŠreact-nativeãã³ãã¬ãŒãã«æ°ãããããŒã¢ãã«ãäœæããé«ããäœãããŠåžžã«match_parentãã¥ãŒã«ããŸãã
ç§ã¯èªåã®Androidãããžã§ã¯ãã«ãé«ããæ°ãã¯ã»ã«ã®æ¬¡ã®ãããŒã¢ãã«ãè¿œå ããŸãã
èæ¯ã®ãããŒã¢ãã«ã¯ã芪ã®ãã¥ãŒã®é«ã10ã«é©å¿ããŸã
èæ¯ã®ãããŒã¢ãã«ã¯ã芪ã®ãã¥ãŒã®é«ã100ã«é©å¿ããŸã
å°ããªèæ¯ã®ãããŒã¢ãã«ã§åäœããããã§ããããã©ã«ãã§ãã®èæ¯ã®ãããŒã¢ãã«ã䜿çšããŠãããžã§ã¯ããåæåããã«ã¯ã react-native init
ã¹ã¯ãªãããå¿
èŠã§ãã äžèšã®èª¬æã®å€æŽãããã«ãªã¯ãšã¹ãã§ä»¥äžã®ãã¡ã€ã«ã«è¿œå ããŸãã
ã©ããããããšãã ãã¡ããªãã£ãª
RN 0.61.0 + AndroidAPIã¬ãã«28ã§åãåé¡ã«çŽé¢ããŠããŸãã
FlatlistãTextInputããã¹ããããã³ã³ããŒãã³ãã¬ã³ããªã³ã°ã®çµã¿åããã«çµã蟌ã¿ãŸãã
@ fabriziobertoglio1987ç§ã¯ãã®æ¹æ³ãè©ŠããŸããããããããç§ã¯ãããæ©èœãããªãã£ããšããsthãéããŸããã ç§ã¯ã¢ã³ããã€ãã«ã€ããŠã»ãšãã©ç¥ããŸããããããŠç§ã¯ããªãããããä¿®æ£ããããšãã§ããŠããããã§ãã ç§ã¯ãŸã éèŠãªå°éå ·ã®åé¡ã«èå³ããããŸããã
@ fabriziobertoglio1987ãšã«ããããã®åé¡ããã°ããä¿®æ£ããããã«è¿œå ã§ãããã€ãã£ãjsã³ãŒããåå¿ãããããšã¯ã§ããŸããïŒ ãç¥ããäžããã
@ asmi24886ãã®åé¡ã確å®ã«åçŸããããã®ãã¹ãã³ã³ããŒãã³ããšããã€ãã£ãã³ãŒã/æ§æã®åé¿çãããã«ããç§ã®ã³ã¡ã³ã
JSã³ãŒãã®ã¿ã䜿çšããåé¿çã¯ãªããšæããŸãã
ããã¯ç§ã®åã®ã¡ãã»ãŒãžhttps://github.com/facebook/react-native/issues/17530#issuecomment-660908150ã®ç¶ãã§ãããããªãŒã©ã³ã¹ã®ä»äºãèŠã€ããŠãã®åé¡ã解決ããããã®ãã«ãªã¯ãšã¹ããæžãããã®ç§ã®åªåã§ãã
Theme.AppCompat.Light
åºã¥ããŠã«ã¹ã¿ã ãããŒã¢ãã«ãäœæããŸããã
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:insetLeft="@dimen/abc_edit_text_inset_horizontal_material"
android:insetRight="@dimen/abc_edit_text_inset_horizontal_material"
android:insetTop="@dimen/abc_edit_text_inset_top_material"
android:insetBottom="@dimen/abc_edit_text_inset_bottom_material">
<selector>
<item android:state_enabled="false" android:drawable="@drawable/abc_textfield_default_mtrl_alpha"/>
<item android:state_pressed="false" android:state_focused="false" android:drawable="@drawable/abc_textfield_default_mtrl_alpha"/>
<item android:drawable="@drawable/abc_textfield_activated_mtrl_alpha"/>
</selector>
</inset>
ã©ã³ã¿ã€ã ã¯æ¬¡ã®ãšã³ããªããçºçããŸãããã®è¡ãåé€ãããšã react-native
ããçŸåšã®Drawableã®æ£ç¢ºãªã³ããŒãæ©èœããã©ã³ã¿ã€ã ãšã©ãŒãããªã¬ãŒãããŸããã https://github.com/facebook/react-native/issues/17530#issuecomment-660017858ã«æå°éã®åçŸå¯èœãªäŸãå«ããŸãã
<item android:state_pressed="false" android:state_focused="false" android:drawable="@drawable/abc_textfield_default_mtrl_alpha"/>
ãã«ãªã¯ãšã¹ããäœæããŠããŸãããã«ãªã¯ãšã¹ããããŒãžããããšã upgrade-helperã䜿çšããŠ
ãã«ãªã¯ãšã¹ãã«ã¯ãRNTesterã¢ããªã±ãŒã·ã§ã³ã§ã®ãã®ã·ããªãªã®åçŸããã³ãã¬ãŒããžã®å€æŽãããã³ãã®åé¡ãåé¿ããããã®äžèšã®ã«ã¹ã¿ã ãããŒã¢ãã«ã®è¿œå ãå«ãŸããŸãã
ããã¯ãDrawableã«<item android:state_pressed="false" android:state_focused="false" android:drawable="@drawable/abc_textfield_default_mtrl_alpha"/>
è¡ãããå Žåã®ã©ã³ã¿ã€ã ãšã©ãŒã玹ä»ãã
ããã¯ãDrawableã«è¡<item android:state_pressed="false" android:state_focused="false" android:drawable="@drawable/abc_textfield_default_mtrl_alpha"/>
ããªãå Žåã®ä¿®æ£ïŒã©ã³ã¿ã€ã ãšã©ãŒãªãïŒã玹ä»ãã
以äžã®ã¹ã¯ãªãŒã³ã·ã§ããã«è¡šç€ºãããŠããããã«ããããŒã¢ãã«xmlãã¡ã€ã«ãã次ã®è¡ãåé€ããŠããŸãxml
<item android:state_pressed="false" android:state_focused="false" android:drawable="@drawable/abc_textfield_default_mtrl_alpha"/>
ç§ã¯ã¹ã¿ã€ã«ãå€ããŠããŸããã Drawableã¯AppCompatãã䜿çšããããã®ãšåãã§ãããã¹ã¿ã€ã«ã¯åãã§ãããã©ã³ã¿ã€ã ãšã©ãŒã¯ããªã¬ãŒãããŸãã
ææ¥ãã«ãªã¯ãšã¹ããå ¬éããããšæããŸãã
ãã®åé¡ã解決ããhttps://github.com/facebook/react-native/pull/29452ãäœæããããã«ç§ãšååããŠãããsunnylqmã«æè¬ããŸãã
äžå®ã®ç¶æ ã確èªããåŸã§ããäžéšã®ããã€ã¹/ Android OSããŒãžã§ã³ã®Drawable.mutateïŒïŒã«ãã°ãããããã§ãã ãã®ãšã©ãŒã®åçŸãšä¿®æ£ã¯é£ãããããã¯ã©ãã·ã¥ãé²ãããã«äŸå€ããã£ããããŠã¿ãŠãã ããã
ãã®åé¡ã¯ã extras / android / support / v7 / appcompat / res / drawable /abc_edit_text_material.xmlã®ãã®è¡ãåå ã§çºçããŸãã
<item android:state_pressed="false" android:state_focused="false" android:drawable="@drawable/abc_textfield_default_mtrl_alpha"/>
äžã®è¡ã¯ãäœæStateListDrawableå€ããTextInput
èæ¯ç»åïŒèæ¯æç»é åã®ç¶æ
ã«å¿ããŠïŒ TextInput
ã
state_pressed="false"
ãšstate_focused="false"
ã¯ãTextInputBackgroundDrawableã®å€æŽãããªã¬ãŒããŸãã ç»åã¯åé¡ã®åå ã§ã¯ãããŸããããããã¥ã¡ã³ãåã®ããã«å«ããŸããã
| abc_textfield_activate_mtrl_alpha | abc_textfield_default_mtrl_alpha |
|ïŒ-------------------------ïŒ|ïŒ-------------------- -----ïŒ|
| | |
DrawableContainer.getChildïŒïŒå
ã®ConstantStateå€æ°csã¯null
ã§ãã null.newDrawable(mSourceRes)
åŒã³åºããšãNullãã€ã³ã¿äŸå€ãããªã¬ãŒãããŸãã ãã®åŒã³åºãã¯ãTextInputãæŒããåŸããã®ã¹ã¿ãã¯ãã¬ãŒã¹ã§TextInputã®ç¶æ
ãå€æŽãããçµæã§ãã
mDrawableFutures
ã¯ããšã³ããªã®æ£ãããªã¹ããå«ãŸããŠããŸããhttps://github.com/facebook/react-native/pull/29452#issuecomment-662616018 ã
final ConstantState cs = mDrawableFutures.valueAt(keyIndex);
final Drawable prepared = prepareDrawable(cs.newDrawable(mSourceRes));
åã®ã³ã¡ã³ãã§è©³çŽ°æ å ±https://github.com/facebook/react-native/issues/17530#issuecomment -661174770 https://github.com/facebook/react-native/issues/17530#issuecomment -660908150ãŸããhttpsïŒ //github.com/facebook/react-native/issues/17530#issuecomment -660506001 https://github.com/facebook/react-native/issues/17530#issuecomment -660458191 https://github.com/facebook/ react-native / issues / 17530ïŒissuecomment -660017858 https://github.com/facebook/react-native/issues/17530#issuecomment -659422298 https://github.com/facebook/react-native/issues/17530# issuecomment -645851033 https://github.com/facebook/react-native/issues/17530#issuecomment -632795323
ã©ããããããšã
è¯ãäžæ¥ã
ãã¡ããªãã£ãª
@ fabriziobertoglio1987äžèšã®ã³ã¡ã³ãã¯
@Coffeegermäžèšã®ã³ã¡ã³ãhttps://github.com/facebook/react-native/issues/17530#issuecomment-662000718ã¯ããã«ãªã¯ãšã¹ãã®æ¹æ³ã®ç°¡åãªèª¬æã§ãhttps://github.com/facebook/react-native/pull / 29452ã¯ãã®åé¡ãä¿®æ£ããŸãã ãã«ãªã¯ãšã¹ããreact-nativeã«ããŒãžããããš
1ïŒæ°ããã¢ããªã«ã¯ãã®ãšã©ãŒã¯ãããŸãã
2ïŒæ¢åã®ã¢ããªã¯ã¢ããã°ã¬ãŒãããããšã©ãŒã¯çºçããŸããã ã¢ããªã±ãŒã·ã§ã³ã®ã¢ããã°ã¬ãŒãæã«/android
ãã©ã«ããŒå
ã®å€æŽãé©çšããæ¹æ³ã®è©³çŽ°ã«ã€ããŠã¯ãupgradeïŒ3-upgrade-your-project-filesã§åç
§ããŠãã ããã
ã¢ããã°ã¬ãŒãããããªãå Žåã¯ãç§ã®PR https://github.com/facebook/react-native/pull/29452ã確èªããŠããããã®å€æŽããããžã§ã¯ãã®android
ãã©ã«ããŒã«è¿œå ã§ããŸãã ãã®PRããã®æ§æå€æŽã¯/ReactAndroid
Javaã³ãŒãããŒã¹ã§ã¯ãªããåæåã«äœ¿çšãããAndroid
ãã³ãã¬ãŒãã«ããããã react-native
ãœãŒã¹ã³ãŒããå€æŽããå¿
èŠã¯ãããŸããããããžã§ã¯ãã
çŸåšãä»ã®åé¡ã«åãçµãã§ããŸãããæ»ã£ãŠããŠãã£ãŒãããã¯ã«è¿ä¿¡ãããã«ãªã¯ãšã¹ãã«å¿ èŠãªæ¹åãå ããŸãã
æ¹åããã£ãŒãããã¯ã®ããã®ææ¡ãããã°ãç§ã«æ»ã£ãŠããŠãã ããã
è¯ãé±æ«ã
ããªãã®å©ããã©ããããããšã
ãã¡ããªãã£ãª
é¢é£ããããã«èãããã³ããããèŠãã°ããhttps://github.com/facebook/react-native/commit/1e4d8d902daca8e524ba67fc3c1f4b77698c4d08
åé·ã§ããããããé©åã«åŠçããªããã©ãããã©ãŒã ã§äžè²«æ§ã®åé¡ãã¯ã©ãã·ã¥ããŸãã¯ãã°ãåŒãèµ·ããå¯èœæ§ã®ãããå³å¯ã«å€ãã®Create + DeleteæäœãçæããŠããŸãã-
ç¹ã«ãCreate + Deleteã®é åºã¯ä¿èšŒãããŠããªãããã§ãïŒèŠªã®å€æŽããããã¥ãŒããæåã«ãäœæããããã®åŸãç°ãªããã¥ãŒãåããã¥ãŒã«å¯ŸããŠåŸã§ãåé€ããçºè¡ããå¯èœæ§ããããŸãïŒã
@ fabriziobertoglio1987
Expoã®äœ¿çšäžã«ããããžã§ã¯ãã®androidãã©ã«ããŒã«ã¢ã¯ã»ã¹ããã«ã誰ãããã®åé¡ãä¿®æ£ããæ¹æ³ã«ã€ããŠäœãèãã¯ãããŸããïŒ ð
@divonelncåé¿çããããŸããããšãã°ãããã¹ãå ¥åãã¬ã³ããªã³ã°ããããã³ã«æ°ããããŒã䜿çšããŸãã
<TextInput key={Math.random()} />
ãããŠãã¡ãããããã¯ä»ã®ããã€ãã®åé¡ãããã©ãŒãã³ã¹ã®äœäžãåŒãèµ·ããå¯èœæ§ããããŸãã
@sunnylqmæ®å¿µãªããããã¯åœ¹ã«ç«ã¡ãŸããã§ããðã äœåãã®ããã¹ãå ¥åãããç»é¢ã§ããŸã ã©ã³ãã ã«ã¯ã©ãã·ã¥ããŠããŸãã
ãã®åé¡ã¯æ¬çªç°å¢ã§ç¢ºèªã§ããŸãã RNïŒ0.62.2ð
åãåé¡ãRN0.63.2ã§ãçºçããŸãã:(
ãã®ã³ãããã«ããããã®åé¡ãä¿®æ£ãããå¯èœæ§ããããŸãã
https://github.com/facebook/react-native/commit/a5b5d1a805a9c54d325763b432be1cf2c8811dc9
ExpoãšRNsdkã§åãåé¡https://github.com/expo/react-native/archive/sdk-38.0.2.tar.gz
ãããŒããã¯ã€ã©ã€ã©ããŸããã @ WilliamAlexander @ Hopdingãœãªã¥ãŒã·ã§ã³ã¯æ©èœããŸãã 以åã¯æ¯ååçŸã§ããã®ã§ç¥ã£ãŠããŸãã
// styles.xml
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="android:editTextStyle">@style/AppEditTextStyle</item>
<item name="editTextStyle">@style/AppEditTextStyle</item> <!-- For compatibility with the support library -->
<item name="android:editTextBackground"><strong i="9">@android</strong>:color/transparent</item>
</style>
<style name="AppEditTextStyle" parent="@style/Widget.AppCompat.EditText">
<item name="android:background"><strong i="10">@android</strong>:color/transparent</item>
</style>
</resources>
ããã¯ããªãè¯ãåé¿çã§ãã 䜿çšããŠããããã¹ãå ¥åã³ã³ããŒãã³ãã®ã©ãããŒãäœæããuseMemoã䜿çšããŠãã®ããŒãçæããŸãã ãã®ããã«ãåäžã®ããã¹ãå ¥åã¯ãåã¬ã³ããªã³ã°ãéããŠåžžã«åãããŒãæã¡ããã¹ãŠã®ããã¹ãå ¥åã«å¯ŸããŠããŒãèšè¿°ããå¿ èŠããããŸããã
export default (props: TextInputProps) => {
const key = useMemo(() => {
return Math.random().toString()
}, [])
return (
<TextInput key={key} {...props} />
)
}
ãšãã¹ãã䜿çšããŠããå Žå
expo SDK 38ãã39ã«ã¢ããã°ã¬ãŒãããåŸããã®ãšã©ãŒãçºçããŸããã
expoãã£ãã·ã¥ïŒexpo -rcïŒãšexpoã¢ãã€ã«ã¢ããªãã£ãã·ã¥ã®äž¡æ¹ãã¯ãªãŒã³ã¢ããããå¿
èŠãããïŒç¢ºå®ã«ã¢ã³ã€ã³ã¹ããŒã«ããŠåã€ã³ã¹ããŒã«ããŸãïŒããšã©ãŒã¯ãªããªããŸããã
@dpnickãã°ãåçŸããã®ã¯éåžžã«å°é£ã§ãã ããã«æçš¿ãããã¹ãã³ã³ããŒãã³ãã䜿çšããŠãå®éã«æ©èœããŠããªãããšã確èªããããšããå§ãããŸãã
æ¬çªç°å¢ã§ãã®ãšã©ãŒãçºçãããã®åé¡ãåçŸã§ããŸãããRNããŒãžã§ã³ã¯0.62.2ã§ããããã¯ãfirebasecrashlyticsããã®ãã°ã§ãã
Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)' on a null object reference
at android.graphics.drawable.DrawableContainer$DrawableContainerState.createAllFutures(DrawableContainer.java:880)
at android.graphics.drawable.DrawableContainer$DrawableContainerState.getOpacity(DrawableContainer.java:1163)
at android.graphics.drawable.DrawableContainer.getOpacity(DrawableContainer.java:434)
at android.graphics.drawable.InsetDrawable.getOpacity(InsetDrawable.java:259)
at android.view.View.computeOpaqueFlags(View.java:19424)
at android.view.View.setBackgroundDrawable(View.java:24701)
at android.view.View.setBackground(View.java:24594)
at android.view.View.<init>(View.java:6191)
at android.widget.TextView.<init>(TextView.java:1223)
at android.widget.EditText.<init>(EditText.java:106)
at android.widget.EditText.<init>(EditText.java:102)
at android.widget.EditText.<init>(EditText.java:98)
at android.widget.EditText.<init>(EditText.java:94)
at com.facebook.react.views.textinput.ReactTextInputShadowNode.createInternalEditText(ReactTextInputShadowNode.java:258)
at com.facebook.react.views.textinput.ReactTextInputShadowNode.setThemedContext(ReactTextInputShadowNode.java:78)
at com.facebook.react.uimanager.UIImplementation.createView(UIImplementation.java:243)
at com.facebook.react.uimanager.UIManagerModule.createView(UIManagerModule.java:469)
at java.lang.reflect.Method.invoke(Method.java)
at com.facebook.react.bridge.JavaMethodWrapper.invoke(JavaMethodWrapper.java:372)
at com.facebook.react.bridge.JavaModuleWrapper.invoke(JavaModuleWrapper.java:151)
at com.facebook.react.bridge.queue.NativeRunnable.run(NativeRunnable.java)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage(MessageQueueThreadHandler.java:27)
at android.os.Looper.loop(Looper.java:237)
at com.facebook.react.bridge.queue.MessageQueueThreadImpl$4.run(MessageQueueThreadImpl.java:226)
at java.lang.Thread.run(Thread.java:919)
@AbdelkhalekESIãã°ãåçŸããã®ã¯éåžžã«å°é£ã§ãã ããã«æçš¿ãããã¹ãã³ã³ããŒãã³ããè©Šã
ãã®åé¡ãä¿®æ£ãããã«ãªã¯ãšã¹ããäœæããŸããhttps://github.com/facebook/react-native/issues/17530#issuecomment-663577143
prã«ã¢ã¯ã»ã¹ããŠãã ããhttps://github.com/facebook/react-native/pull/29452æ瀺ã«åŸã£ãŠãã ããhttps://github.com/facebook/react-native/wiki/Building-from-source#publish- your-own-version-of-react-nativeã§ããµããŒããå¿ èŠãªå Žåã¯ãç¥ãããã ããã Expoçšã«å¥ã®PRãäœæããå¿ èŠããããã©ãããä»é±æ«ã«ç¢ºèªããããšããŸããããã®PRãããŒãžãããŠãªãªãŒã¹ãããããreactnativeãã¢ããã°ã¬ãŒãããããšã§ä¿®æ£ããããšæããŸãã ã©ããããããšãã ãããã¿ãªãã
以åã®æçš¿ã®è©³çŽ°https://github.com/facebook/react-native/issues/17530#issuecomment-662000718
ããŒãžã§ã³"react-native": "0.63.3"
åãåé¡
ã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ïŒã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã䜿çšããŠããå ŽåïŒã®Expoã®ãã£ãã·ã¥ããŸãã¯äœ¿çšããŠãããã©ââãããã©ãŒã ã®Expoã¢ããªã±ãŒã·ã§ã³ã®ãã£ãã·ã¥ãã¯ãªã¢ããã ãã§ãã
@ tzeneng96ããããŸããããã£ãã·ã¥ã®ã¯ãªã¢ã¯ã¢ããªã§æ©èœããŸãããåé¡ãåçºããããã蚱容ã§ãã解決çã§ã¯ãããŸããã
@AbdelkhalekESIãã°ãåçŸããã®ã¯éåžžã«å°é£ã§ãã ããã«æçš¿ãããã¹ãã³ã³ããŒãã³ããè©Šã
ãã®ã³ã³ããŒãã³ãã䜿çšããŠããã®ãã°ãåçŸããããšãã§ããŸããã ãŸããæ¬çªç°å¢ã§ãã®ã¯ã©ãã·ã¥ã®ãã°ãå€æ°åãåããŸããã ãããžã§ã¯ãã¯çŸåšãããŒãžã§ã³0.63.3ã§åå¿ããŠããŸãã
ééã£ãŠãããã©ããã¯ããããŸãããã@ glenn-axsyãåŒçšãããã®ãããã¯ã§ã¯ãandoid \ app \ src \ main \ res \ values \ styles.xmlãè¿œå ããããšã§è§£æ±ºã§ãããšç解ããŠããŸããã¢ã€ãã ïŒ
"item name =" androidïŒeditTextBackground "> @ androidïŒcolor / transparent / item"
ç§ã¯ãŸã ãœãªã¥ãŒã·ã§ã³ããã¹ãããŠããŸãã
@thiagocristiannoããªãã®ç解ã¯æ£ããã§ãããããã¯å®ç§ãªè§£æ±ºçã§ã¯ãªããExpoéçºè ã¯ãã®èšå®ãå¶åŸ¡ã§ããªãããã圹ã«ç«ããªããšæããŸãã
ãããŒããã¯ã€ã©ã€ã©ããŸããã @ WilliamAlexander @ Hopdingãœãªã¥ãŒã·ã§ã³ã¯æ©èœããŸãã 以åã¯æ¯ååçŸã§ããã®ã§ç¥ã£ãŠããŸãã
// styles.xml<resources> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <!-- Customize your theme here. --> <item name="android:editTextStyle">@style/AppEditTextStyle</item> <item name="editTextStyle">@style/AppEditTextStyle</item> <!-- For compatibility with the support library --> <item name="android:editTextBackground"><strong i="10">@android</strong>:color/transparent</item> </style> <style name="AppEditTextStyle" parent="@style/Widget.AppCompat.EditText"> <item name="android:background"><strong i="11">@android</strong>:color/transparent</item> </style> </resources>
@ @jordangrant ãåé¿çã¯ã©ãã§èŠãŸãããïŒ
ãããŒããã¯ã€ã©ã€ã©ããŸããã @ WilliamAlexander @ Hopdingãœãªã¥ãŒã·ã§ã³ã¯æ©èœããŸãã 以åã¯æ¯ååçŸã§ããã®ã§ç¥ã£ãŠããŸãã
// styles.xml<resources> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <!-- Customize your theme here. --> <item name="android:editTextStyle">@style/AppEditTextStyle</item> <item name="editTextStyle">@style/AppEditTextStyle</item> <!-- For compatibility with the support library --> <item name="android:editTextBackground"><strong i="11">@android</strong>:color/transparent</item> </style> <style name="AppEditTextStyle" parent="@style/Widget.AppCompat.EditText"> <item name="android:background"><strong i="12">@android</strong>:color/transparent</item> </style> </resources>
@ @jordangrant ãåé¿çã¯ã©ãã§èŠãŸãããïŒ
@bobowincaããã¯éåžžã«é·ãã¹ã¬ããã§ããããã®ãœãªã¥ãŒã·ã§ã³ã¯100ïŒ ç§ã®ããã«æ©èœããŸããã RN63.3å芧äŒãªã
@ jordangrant ãDohïŒ åžžã«å°ããåã«èŠãŠãã ããã ç§ã¯å€±æããŸããã ããããšãããããŸãã
ãŸããåé¡ãäžè²«ããŠåçŸã§ããããã§ãã ã©ããã£ãŠããã®ãããã ãããŸã§ã¹ã¿ãã¯ãã¬ãŒã¹ãèŠãã ãã§ãã ä¿®æ£ã確èªããæ¹æ³ãèããŠããŸãã
@bobowincaããã«æçš¿ãããã¹ãã³ã³ããŒãã³ãã¯ãäžè²«ããŠåçŸããã®ã«åœ¹ç«ã€ã¯ãã§ãã
@bobowincaããã«æçš¿ãããã¹ãã³ã³ããŒãã³ãã¯ãäžè²«ããŠåçŸããã®ã«åœ¹ç«ã€ã¯ãã§ãã
ãã£ãŒã ã®ããã«æ©èœããŸãïŒ ã°ã¬ã³ããããšãïŒ
styles.xmlãžã®<item name="android:editTextBackground"><strong i="5">@android</strong>:color/transparent</item>
è¿œå ã¯æ©èœããŠããŸãïŒ
TextInputã®key={Math.random().string()}
ã«è¿œå ããã¡ãœããã¯æ©èœããŠããŸããããåã¬ã³ããªã³ã°ãããšãæ¯ç§ããŒããŒããé衚瀺ã«ãªããŸããããã¯åãå
¥ããããŸããã§ããã
æãåèã«ãªãã³ã¡ã³ã
ãã®åé¡ã«ãããæ¬çªç°å¢ã§ãã¢ããªãã¯ã©ãã·ã¥ããŸããã åçŸããã®ãæ¬åœã«é£ããã®ã§ãããã¯åä»ãªãã°ã§ãã ç§ãã¡ã®ã¢ããªã®ææãªä¿®æ£ãèŠã€ããŸãããä»ã®äººã®æéãšãã©ã¹ãã¬ãŒã·ã§ã³ãç¯çŽã§ããããã«ãããã§ç§ãã¡ã®çºèŠãå ±æããããšæããŸãã
ä»æ§ãšããŒãžã§ã³
ãã®ãã°ã«ãããSamsungãGoogleãããã³LGAndroidããã€ã¹ã§ã¢ããªãã¯ã©ãã·ã¥ããŸããã 次ã®AndroidããŒãžã§ã³ããã¯ã©ãã·ã¥ã¬ããŒãããããŸãã
8.0.0
8.1.0
7.1.1
ç§ãã¡ã®ã¢ããªã¯å®è¡ãããŠããŸãïŒ
react-native
ïŒ0.53.0react
ïŒ16.2.0ã¯ã©ãã·ã¥ã®åå
ä»ã®äººããã®ã¹ã¬ããã§ææããŠããããã«ããã®åé¡ã¯
TextInput
ãFlatList
ãããã³ScrollView
ã³ã³ããŒãã³ãã®çµã¿åãããã¬ã³ããªã³ã°ããããšã«ãã£ãŠåŒãèµ·ããããããã§ãã ãã®äŸã§ã¯ãFlatList
äžã«ã¬ã³ããªã³ã°ãããåäžã®TextInput
ãå«ãç»é¢ããããŸããFlatList
ã®ã¢ã€ãã ã®1ã€ãã¿ãããããšãã¢ããªã¯ãã©ãŒã ãå«ãæ°ããç»é¢ã«ç§»åããŸãã ãã®ãã©ãŒã ã®ã«ãŒãã³ã³ããŒãã³ãã¯ScrollView
ã§ãããã€ãã®TextInput
ã³ã³ããŒãã³ããå«ãŸããŠããŸãïŒããã€ãã®ãã¿ã³ããã®ä»ã®ã«ã¹ã¿ã ã³ã³ããŒãã³ããå«ãŸããŠããŸãïŒã ãŠãŒã¶ãŒããããã®FlatList
ã¢ã€ãã ã®ãããããã¿ãããããšãã¢ããªãã¯ã©ãã·ã¥ããŸãïŒæ¯åçºçããããã§ã¯ãªãããšã«æ³šæããŠãã ããïŒããã®åé¡ãåçŸããããšã¯å°é£ã§ãã å®éãç§ãã¡ã¯ããããããšãã§ããŸããã§ããã ãã ããAppseeã»ãã·ã§ã³ã®èšé²ãèŠããšãã¯ãŒã¯ãããŒã®ãã®æç¹ã§ã¯ã©ãã·ã¥ãçºçããŠããããšãããããŸãã
åé¡ãåçŸã§ããªããããAppseeã®ã¯ã©ãã·ã¥ãã°ã䜿çšããŠãããã°ããå¿ èŠããããŸããã 以äžã®ã¯ã©ãã·ã¥ã¬ããŒãããã¹ã¿ãã¯ãã¬ãŒã¹ãã³ããŒããŸããïŒãããŠãããã€ãã®ãã€ãºã®å€ãã»ã¯ã·ã§ã³ãçç¥ããŸããïŒã ããã¯ãä»ã®äººããã®ã¹ã¬ããã«æçš¿ããã¹ã¿ãã¯ãã¬ãŒã¹ãšã»ãŒåãã§ãã
åé¡ã®åå
ãã®ã¹ã¬ãããèªã¿ãæ°æéãŸãã¯èª¿æ»ãè¡ã£ãåŸã
ReactTextInputManager.java
ãã¡ã€ã«ã«underlineColorAndroid
propãã³ãã©ãŒãèŠã€ãããŸãããã³ã¡ã³ãã«ãªã³ã¯ãããŠãããã°ã¬ããŒãã«ã¯ã次ã®ã¹ã¿ãã¯ãã¬ãŒã¹ãå«ãŸããŠããŸãã
ããã¯ãã¢ããªã§çºçããŠããã¹ã¿ãã¯ãã¬ãŒã¹ãšäžèŽããŸãã æ ¹æ¬çãªåé¡ãå®å šã«ç解ããŠãããµããããŠããŸããããæ¬çªç°å¢ã§ã¢ããªãã¯ã©ãã·ã¥ããåå ã¯ã
Drawable.mutate()
ãã°ãããªã¬ãŒãããããšãåå ã§ããå¯èœæ§ããããŸãã ããã¯ãTextInput
ã³ã³ããŒãã³ãã«underlineColorAndroid
å°éå ·ãèšå®ããããšãããšãã«çºçããŸãïŒãããã£ãŠãReactTextInputManager.setUnderlineColor
ã¡ãœãããåŒã³åºããŸãïŒãç§ãã¡ã®ã¢ããªã¯ã次ã®å°éå ·ã§
TextInput
ãã¬ã³ããªã³ã°ããŠããŸãããããã®ãã¡ã®1ã€ã¯underlineColorAndroid="transparent"
ïŒä¿®æ£æ¹æ³
ã¢ããªã®
TextInput
ã³ã³ããŒãã³ãããã¢ã³ããŒã¹ã³ã¢ãåé€ããã«ã¯ããã®å°éå ·ãèšå®ããå¿ èŠããããŸããã ããããç§ãã¡ã®èª¿æ»çµæã«åºã¥ããšããã®propãã³ãã©ãŒãAndroidã®ãã°ãåŒãèµ·ãããŠããããã§ãã¢ããªããšãã©ãã¯ã©ãã·ã¥ããŠããŸããã幞ããAndroidã®
TextInput
ã³ã³ããŒãã³ãããã¢ã³ããŒã¹ã³ã¢ãåé€ããå¥ã®æ¹æ³ããããŸããandroid/app/src/main/res/values/styles.xml
ãã¡ã€ã«ã«è¡ãè¿œå ã§ããŸããç§ã¯ãŸãã次ã®ããšã瀺åããèŠãŠãããããããç§ãã¡ã®ããã«äžç·ãåé€ããªãã£ãããšã«æ³šæããŠãã ããã
ããã¯æ ¹æ¬çãªåé¡ã«å¯ŸåŠããŠããŸããã ããã¯ã
TextInput
ã³ã³ããŒãã³ãã§ã®underlineColorAndroid
ããããã®äœ¿çšãåé¿ããããšãå«ãåãªãåé¿çã§ããããŒã«ã«ã§åé¡ãåçŸã§ããªãã£ãããããããå®éã«æ©èœãããã©ããã¯ãŸã ã¯ã£ãããšã¯èšããŸããã ãã®å€æŽã¯ãæ°é±é以å ã«ã¢ããªã®ã¢ããããŒãã§å±éãããŸãã ãã®åŸããããããçºçãããã©ããã確èªããããã«ãã°ããåŸ ã€å¿ èŠããããŸãã 調æ»çµæãå ±åããããšæããŸãã
ãã®èç«ãããåé¡ã«åãçµãã§ãããã¹ãŠã®äººã«é 匵ã£ãŠãã ããïŒ ãããã圹ã«ç«ãŠã°å¹žãã§ãã