web-dev-qa-db-ja.com

SwitchCompatスローエラー

フラグメントでswitchcompatを使用しようとしています。サポートされている最小APIは14、最大は21です。マテリアライズドビューを適用して、Lollipop以前のすべてのバージョンに切り替えようとしていますAndroidバージョン。ただし、以下のコードを使用すると、エラーが発生します。修正しますか?

<Android.support.v7.widget.SwitchCompat
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content" />

例外をスローしているJavaコードで膨らませる:

 @Override                                                                                       
 public View onCreateView(LayoutInflater inflater, ViewGroup container,                          
                          Bundle savedInstanceState) {                                           
     final View view = inflater.inflate(R.layout.fragment_scheduler_ui, container, false);   

参照: http://Android-developers.blogspot.in/2014/10/appcompat-v21-material-design-for-pre.html

例外:

10-24 14:15:15.880    1561-1561/com.stackoverflow.ranjith.androidprojdel E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.stackoverflow.ranjith.androidprojdel, PID: 1561
Java.lang.NullPointerException
        at Android.text.Layout.getDesiredWidth(Layout.Java:67)
        at Android.support.v7.widget.SwitchCompat.makeLayout(SwitchCompat.Java:570)
        at Android.support.v7.widget.SwitchCompat.onMeasure(SwitchCompat.Java:495)
        at Android.view.View.measure(View.Java:16497)
        at Android.view.ViewGroup.measureChildWithMargins(ViewGroup.Java:5125)
        at Android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.Java:1404)
        at Android.widget.LinearLayout.measureVertical(LinearLayout.Java:695)
        at Android.widget.LinearLayout.onMeasure(LinearLayout.Java:588)
        at Android.view.View.measure(View.Java:16497)
        at Android.view.ViewGroup.measureChildWithMargins(ViewGroup.Java:5125)
        at Android.widget.FrameLayout.onMeasure(FrameLayout.Java:310)
        at Android.view.View.measure(View.Java:16497)
        at Android.view.ViewGroup.measureChildWithMargins(ViewGroup.Java:5125)
        at Android.widget.FrameLayout.onMeasure(FrameLayout.Java:310)
        at Android.view.View.measure(View.Java:16497)
        at Android.view.ViewGroup.measureChildWithMargins(ViewGroup.Java:5125)
        at com.Android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.Java:327)
        at Android.view.View.measure(View.Java:16497)
        at Android.view.ViewGroup.measureChildWithMargins(ViewGroup.Java:5125)
        at Android.widget.FrameLayout.onMeasure(FrameLayout.Java:310)
        at com.Android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.Java:2291)
        at Android.view.View.measure(View.Java:16497)
        at Android.view.ViewRootImpl.performMeasure(ViewRootImpl.Java:1916)
        at Android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.Java:1113)
        at Android.view.ViewRootImpl.performTraversals(ViewRootImpl.Java:1295)
        at Android.view.ViewRootImpl.doTraversal(ViewRootImpl.Java:1000)
        at Android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.Java:5670)
        at Android.view.Choreographer$CallbackRecord.run(Choreographer.Java:761)
        at Android.view.Choreographer.doCallbacks(Choreographer.Java:574)
        at Android.view.Choreographer.doFrame(Choreographer.Java:544)
        at Android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.Java:747)
        at Android.os.Handler.handleCallback(Handler.Java:733)
        at Android.os.Handler.dispatchMessage(Handler.Java:95)
        at Android.os.Looper.loop(Looper.Java:136)
        at Android.app.ActivityThread.main(ActivityThread.Java:5017)
        at Java.lang.reflect.Method.invokeNative(Native Method)
        at Java.lang.reflect.Method.invoke(Method.Java:515)
        at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:779)
        at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:595)
        at dalvik.system.NativeStart.main(Native Method)

Build.gradle:

dependencies {
    compile 'com.Android.support:cardview-v7:+'
    compile 'com.Android.support:recyclerview-v7:+'
    compile 'com.Android.support:palette-v7:+'
    compile 'com.Android.support:support-v4:+'
    compile "com.Android.support:appcompat-v7:21.0.+"
    compile fileTree(dir: 'libs', include: ['*.jar'])
}
22
Psypher

SwitchCompatでは、Android:textOnを設定しない限り、Android:textOffapp:showText="false"の値を設定する必要があります。

<Android.support.v7.widget.SwitchCompat
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:textOn="ON"
    Android:textOff="OFF" />

または(XMLファイルの先頭にxmlns:app="http://schemas.Android.com/apk/res-auto"があると仮定します)

<Android.support.v7.widget.SwitchCompat
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    app:showText="false" />
56
ianhanniballake

同じエラーが発生し、何も見つからず、ここに着陸しました。同僚は、私にとってこの例外を修正する1つの小さなことを提案しました。だから私はこれをここに残したかった:

SwitchMaterialまたはSwitchCompatは、内部でカスタムdefStyleAttrを使用します。したがって、提供されていない場合は常にdefStyleAttrを0でオーバーライドするデフォルトのコード。これにより、親コンポーネントのスタイルが上書きされ、クラッシュが発生します。

コンストラクターの変更:

class MySwitch(
  context: Context,
  attrs: AttributeSet? = null,
  defStyleAttr: Int = 0
) : SwitchMaterial(context, attrs, defStyleAttr)

class MySwitch(
  context: Context,
  attrs: AttributeSet? = null
) : SwitchMaterial(context, attrs)

私のために問題を解決しました

0
scholt