2016-08-06 8 views
0

レイアウトの一部としてフラグメントビューを使用するアプリケーションがあります。この断片の中で、私はカスタム描画を行うことができるペイントキャンバスをインスタンス化したいと思います。Android:フラグメント内のカスタムビューの膨張

問題は、私は、エラーandroid.view.InflateException: Binary XML file line #15: Binary XML file line #15: Error inflating class com.example.xxxxx.NeckCanvasOverlay

とフラグメントを膨らませるために行くとき、私は適切に膨らまないように、私のペイントクラスを引き起こしているかわからないんだけど、私のアプリがクラッシュしています。私はフラグメント内でfindViewByIdをどのように使用するかに関する特別なルールがあることを知っていますが、フラグメントのビュー自体(「コード」では「v」と呼ばれます)でfindViewByidを呼び出しているので、

この問題を解決するにはどうすればよいですか?

FragmentNeckDisplayMenu.java(断片クラス)

public class FragmentNeckDisplayMenu extends Fragment { 
    private static View v; 
    private NeckCanvasOverlay neckHUD; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     v = inflater.inflate(R.layout.menu_fragment_neck_display,container,false);  //ERROR HERE 
     NeckCanvasOverlay neckHUD = (NeckCanvasOverlay) v.findViewById(R.id.neckHUD); //paint test 
     ... 
     return v; 
    } 
} 

NeckCanvasOverlay.java(ペイントクラス)

class NeckCanvasOverlay extends View { 
    private Paint mPainter; 

    public NeckCanvasOverlay(Context context) { 
     super(context); 
     initView(); 
    } 

    private void initView(){ //Initializes canvas & paint objects here to save performance 
     mPainter = new Paint(Paint.ANTI_ALIAS_FLAG); 
     mPainter.setColor(Color.BLUE); 
     mPainter.setAlpha(128); 
    } 

    @Override 
    public void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     canvas.drawCircle(180, 900, 200, mPainter); 
    } 
} 

menu_fragment_neck_display.xml(フラグメントのレイアウト)

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:id="@+id/canvas" 
    android:background="@drawable/image"> 

    <LinearLayout 
     android:layout_width="148dp" 
     android:layout_height="0dp" 
     android:layout_gravity="center" 
     android:layout_weight="4"> 
     !--Custom view for Canvas here --> 
     <com.example.xxxxx.NeckCanvasOverlay 
      android:id="@+id/neckHUD" 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" 
      android:background="@drawable/neck_for_menu"/> 
    </LinearLayout> 

    <Button 
     android:id="@+id/menuIcon" 
     android:layout_width="wrap_content" 
     android:layout_height="0dp" 
     android:layout_marginTop="64dp" 
     android:text="Menu" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:layout_gravity="bottom" 
     android:layout_weight="0.5"/> 
</LinearLayout> 

のフルスタックトレース(編集:付属フルトレース)

08-06 21:47:24.894 26334-26334/com.example.xxxxx E/ACRA: ACRA caught a InflateException for com.example.xxxxx 
                  android.view.InflateException: Binary XML file line #15: Binary XML file line #15: Error inflating class com.example.gu.NeckCanvasOverlay 
                   at android.view.LayoutInflater.inflate(LayoutInflater.java:551) 
                   at android.view.LayoutInflater.inflate(LayoutInflater.java:429) 
                   at com.example.xxxxx.FragmentNeckDisplayMenu.onCreateView(FragmentNeckDisplayMenu.java:32) 
                   at android.support.v4.app.Fragment.performCreateView(Fragment.java:1962) 
                   at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067) 
                   at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248) 
                   at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738) 
                   at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1613) 
                   at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:570) 
                   at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141) 
                   at android.support.v4.view.ViewPager.populate(ViewPager.java:1106) 
                   at android.support.v4.view.ViewPager.populate(ViewPager.java:952) 
                   at android.support.v4.view.ViewPager.setOffscreenPageLimit(ViewPager.java:733) 
                   at com.example.xxxxx.PlayFrets.configMenu(PlayFrets.java:150) 
                   at com.example.xxxxx.AsyncTask_NoteFileLoader.onPostExecute(AsyncTask_NoteFileLoader.java:125) 
                   at com.example.xxxxx.AsyncTask_NoteFileLoader.onPostExecute(AsyncTask_NoteFileLoader.java:9) 
                   at android.os.AsyncTask.finish(AsyncTask.java:651) 
                   at android.os.AsyncTask.access$500(AsyncTask.java:180) 
                   at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668) 
                   at android.os.Handler.dispatchMessage(Handler.java:102) 
                   at android.os.Looper.loop(Looper.java:158) 
                   at android.app.ActivityThread.main(ActivityThread.java:7229) 
                   at java.lang.reflect.Method.invoke(Native Method) 
                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
                   Caused by: android.view.InflateException: Binary XML file line #15: Error inflating class com.example.gu.NeckCanvasOverlay 
                   at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:788) 
                   at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:716) 
                   at android.view.LayoutInflater.rInflate(LayoutInflater.java:847) 
                   at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:810) 
                   at android.view.LayoutInflater.rInflate(LayoutInflater.java:855) 
                   at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:810) 
                   at android.view.LayoutInflater.inflate(LayoutInflater.java:527) 
                   at android.view.LayoutInflater.inflate(LayoutInflater.java:429)  
                   at com.example.xxxxx.FragmentNeckDisplayMenu.onCreateView(FragmentNeckDisplayMenu.java:32)  
                   at android.support.v4.app.Fragment.performCreateView(Fragment.java:1962)  
                   at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)  
                   at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248)  
                   at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738)  
                   at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1613)  
                   at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:570)  
                   at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)  
                   at android.support.v4.view.ViewPager.populate(ViewPager.java:1106)  
                   at android.support.v4.view.ViewPager.populate(ViewPager.java:952)  
                   at android.support.v4.view.ViewPager.setOffscreenPageLimit(ViewPager.java:733)  
                   at com.example.xxxxx.PlayFrets.configMenu(PlayFrets.java:150)  
                   at com.example.xxxxx.AsyncTask_NoteFileLoader.onPostExecute(AsyncTask_NoteFileLoader.java:125)  
                   at com.example.xxxxx.AsyncTask_NoteFileLoader.onPostExecute(AsyncTask_NoteFileLoader.java:9)  
                   at android.os.AsyncTask.finish(AsyncTask.java:651)  
                   at android.os.AsyncTask.access$500(AsyncTask.java:180)  
                   at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668)  
                   at android.os.Handler.dispatchMessage(Handler.java:102)  
                   at android.os.Looper.loop(Looper.java:158)  
                   at android.app.ActivityThread.main(ActivityThread.java:7229)  
                   at java.lang.reflect.Method.invoke(Native Method)  
                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)  
                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)  
                   Caused by: java.lang.ClassNotFoundException: Didn't find class "com.example.gu.NeckCanvasOverlay" on path: DexPathList[[zip file "/data/app/com.example.xxxxx-2/base.apk"],nativeLibraryDirectories=[/data/app/com.example.xxxxx-2/lib/arm64, /vendor/lib64, /system/lib64]] 
                   at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) 
                   at java.lang.ClassLoader.loadClass(ClassLoader.java:511) 
                   at java.lang.ClassLoader.loadClass(ClassLoader.java:469) 
                   at android.view.LayoutInflater.createView(LayoutInflater.java:595) 
                   at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:776) 
                   at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:716)  
                   at android.view.LayoutInflater.rInflate(LayoutInflater.java:847)  
                   at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:810)  
                   at android.view.LayoutInflater.rInflate(LayoutInflater.java:855)  
                   at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:810)  
                   at android.view.LayoutInflater.inflate(LayoutInflater.java:527)  
                   at android.view.LayoutInflater.inflate(LayoutInflater.java:429)  
                   at com.example.xxxxx.FragmentNeckDisplayMenu.onCreateView(FragmentNeckDisplayMenu.java:32)  
                   at android.support.v4.app.Fragment.performCreateView(Fragment.java:1962)  
                   at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)  
                   at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248)  
                   at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738)  
                   at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1613)  
                   at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:570)  
                   at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)  
                   at android.support.v4.view.ViewPager.populate(ViewPager.java:1106)  
                   at android.support.v4.view.ViewPager.populate(ViewPager.java:952)  
                   at android.support.v4.view.ViewPager.setOffscreenPageLimit(ViewPager.java:733)  
                   at com.example.xxxxx.PlayFrets.configMenu(PlayFrets.java:150)  
                   at com.example.xxxxx.AsyncTask_NoteFileLoader.onPostExecute(AsyncTask_NoteFileLoader.java:125)  
                   at com.example.xxxxx.AsyncTask_NoteFileLoader.onPostExecute(AsyncTask_NoteFileLoader.java:9)  
                   at android.os.AsyncTask.finish(AsyncTask.java:651)  
                   at android.os.AsyncTask.access$500(AsyncTask.java:180)  
                   at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668)  
                   at android.os.Handler.dispatchMessage(Handler.java:102)  
                   at android.os.Looper.loop(Looper.java:158)  
                   at android.app.ActivityThread.main(ActivityThread.java:7229)  
                   at java.lang.reflect.Method.invoke(Native Method)  
                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)  
                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)  
                   Suppressed: java.lang.ClassNotFoundException: com.example.gu.NeckCanvasOverlay 
                   at java.lang.Class.classForName(Native Method) 
                   at java.lang.BootClassLoader.findClass(ClassLoader.java:781) 
                   at java.lang.BootClassLoader.loadClass(ClassLoader.java:841) 
                   at java.lang.ClassLoader.loadClass(ClassLoader.java:504) 
                     ... 33 more 
                   Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available 
08-06 21:47:24.954 26334-27123/? E/AndroidRuntime: FATAL EXCEPTION: main 
                Process: com.example.xxxxx, PID: 26334 
                android.view.InflateException: Binary XML file line #15: Binary XML file line #15: Error inflating class com.example.gu.NeckCanvasOverlay 
                 at android.view.LayoutInflater.inflate(LayoutInflater.java:551) 
                 at android.view.LayoutInflater.inflate(LayoutInflater.java:429) 
                 at com.example.xxxxx.FragmentNeckDisplayMenu.onCreateView(FragmentNeckDisplayMenu.java:32) 
                 at android.support.v4.app.Fragment.performCreateView(Fragment.java:1962) 
                 at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067) 
                 at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248) 
                 at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738) 
                 at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1613) 
                 at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:570) 
                 at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141) 
                 at android.support.v4.view.ViewPager.populate(ViewPager.java:1106) 
                 at android.support.v4.view.ViewPager.populate(ViewPager.java:952) 
                 at android.support.v4.view.ViewPager.setOffscreenPageLimit(ViewPager.java:733) 
                 at com.example.xxxxx.PlayFrets.configMenu(PlayFrets.java:150) 
                 at com.example.xxxxx.AsyncTask_NoteFileLoader.onPostExecute(AsyncTask_NoteFileLoader.java:125) 
                 at com.example.xxxxx.AsyncTask_NoteFileLoader.onPostExecute(AsyncTask_NoteFileLoader.java:9) 
                 at android.os.AsyncTask.finish(AsyncTask.java:651) 
                 at android.os.AsyncTask.access$500(AsyncTask.java:180) 
                 at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668) 
                 at android.os.Handler.dispatchMessage(Handler.java:102) 
                 at android.os.Looper.loop(Looper.java:158) 
                 at android.app.ActivityThread.main(ActivityThread.java:7229) 
                 at java.lang.reflect.Method.invoke(Native Method) 
                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
                Caused by: android.view.InflateException: Binary XML file line #15: Error inflating class com.example.gu.NeckCanvasOverlay 
                 at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:788) 
                 at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:716) 
                 at android.view.LayoutInflater.rInflate(LayoutInflater.java:847) 
                 at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:810) 
                 at android.view.LayoutInflater.rInflate(LayoutInflater.java:855) 
                 at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:810) 
                 at android.view.LayoutInflater.inflate(LayoutInflater.java:527) 
                 at android.view.LayoutInflater.inflate(LayoutInflater.java:429)  
                 at com.example.xxxxx.FragmentNeckDisplayMenu.onCreateView(FragmentNeckDisplayMenu.java:32)  
                 at android.support.v4.app.Fragment.performCreateView(Fragment.java:1962)  
                 at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)  
                 at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248)  
                 at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738)  
                 at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1613)  
                 at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:570)  
                 at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)  
                 at android.support.v4.view.ViewPager.populate(ViewPager.java:1106)  
                 at android.support.v4.view.ViewPager.populate(ViewPager.java:952)  
                 at android.support.v4.view.ViewPager.setOffscreenPageLimit(ViewPager.java:733)  
                 at com.example.xxxxx.PlayFrets.configMenu(PlayFrets.java:150)  
                 at com.example.xxxxx.AsyncTask_NoteFileLoader.onPostExecute(AsyncTask_NoteFileLoader.java:125)  
                 at com.example.xxxxx.AsyncTask_NoteFileLoader.onPostExecute(AsyncTask_NoteFileLoader.java:9)  
                 at android.os.AsyncTask.finish(AsyncTask.java:651)  
                 at android.os.AsyncTask.access$500(AsyncTask.java:180)  
                 at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668)  
                 at android.os.Handler.dispatchMessage(Handler.java:102)  
                 at android.os.Looper.loop(Looper.java:158)  
                 at android.app.ActivityThread.main(ActivityThread.java:7229)  
                 at java.lang.reflect.Method.invoke(Native Method)  
                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)  
                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)  
                Caused by: java.lang.ClassNotFoundException: Didn't find class "com.example.gu.NeckCanvasOverlay" on path: DexPathList[[zip file "/data/app/com.example.xxxxx-2/base.apk"],nativeLibraryDirectories=[/data/app/com.example.xxxxx-2/lib/arm64, /vendor/lib64, /system/lib64]] 
                 at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) 
                 at java.lang.ClassLoader.loadClass(ClassLoader.java:511) 
                 at java.lang.ClassLoader.loadClass(ClassLoader.java:469) 
                 at android.view.LayoutInflater.createView(LayoutInflater.java:595) 
                 at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:776) 
                 at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:716)  
                 at android.view.LayoutInflater.rInflate(LayoutInflater.java:847)  
                 at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:810)  
                 at android.view.LayoutInflater.rInflate(LayoutInflater.java:855)  
                 at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:810)  
                 at android.view.LayoutInflater.inflate(LayoutInflater.java:527)  
                 at android.view.LayoutInflater.inflate(LayoutInflater.java:429)  
                 at com.example.xxxxx.FragmentNeckDisplayMenu.onCreateView(FragmentNeckDisplayMenu.java:32)  
                 at android.support.v4.app.Fragment.performCreateView(Fragment.java:1962)  
                 at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)  
                 at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248)  
                 at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738)  
                 at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1613)  
                 at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:570)  
                 at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)  
                 at android.support.v4.view.ViewPager.populate(ViewPager.java:1106)  
                 at android.support.v4.view.ViewPager.populate(ViewPager.java:952)  
                 at android.support.v4.view.ViewPager.setOffscreenPageLimit(ViewPager.java:733)  
                 at com.example.xxxxx.PlayFrets.configMenu(PlayFrets.java:150)  
                 at com.example.xxxxx.AsyncTask_NoteFileLoader.onPostExecute(AsyncTask_NoteFileLoader.java:125)  
+0

さらに根本的な原因をスタックトレースで確認してください。カスタムの 'View'を膨らませるのに必要なコンストラクタが不足しているからでしょう。 'Context'と' AttributeSet'を取る2引数のコンストラクタが必要です。 –

+0

@MikeM。含まれています – Cody

+0

あなたはこのリンクでは、答えを見ることができますhttp://stackoverflow.com/questions/17599450/how-to-inflate-view-inside-fragment –

答えて

3

すぐに問題が発生するのは、ClassNotFoundExceptionです。レイアウトでカスタムViewを扱う場合、レイアウトXMLのクラス名が間違っていることがよくあります。これはここで問題になっているようです。 XMLタグに、カスタムViewクラスの完全修飾クラス名が正しく指定されていることを確認します。このクラス名は、ファイルの先頭からクラス名の前にクラスのpackageになります。

さらに、レイアウトから膨らんだViewは、ContextAttributeSetの2つの引数を持つコンストラクタでインスタンス化されます。インフレーションを可能にするためには、クラス定義に少なくともそのコンストラクタが必要です。そうしないと、NoSuchMethodExceptionが返されます。 XMLにstyle属性を使用する場合は、追加のコンストラクタが必要です。 Viewを拡張するだけの場合は、コンストラクタをチェーン化することもお勧めします。例:

public NeckCanvasOverlay(Context context) { 
    this(context, null); 
} 

public NeckCanvasOverlay(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    initView(); 
} 
0

カスタムViewのための3つのすべてのコンストラクタを含める方が安全です。たとえば、NeckCanvasOverlayのコンストラクタを次に示します。

public NeckCanvasOverlay(Context context) { 
     super(context); 
     initView(); 
    } 

    public NeckCanvasOverlay(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     initView(); 
    } 

    public NeckCanvasOverlay(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     initView(); 
    } 

これが役立ちます。試してみて、同じエラーが出たら教えてください。

+0

私はまだ同じエラーが表示されています。 – Cody

関連する問題