Android:错误充气扩展类

问题描述:

我知道你以前会看到这个问题。我知道我有:-)。但是,仍然,梳理我发现的所有答案,我仍然得到膨胀的类错误。我的布局有一个扩展的webView,因为我希望能够左右滑动以加载前一个和下一个html页面。 我包含了整个布局,因为我发现大部分答案都是以抽象的方式处理webView,而不是作为大图的一部分。希望这个答案能够帮助他人获得更大的图片。Android:错误充气扩展类

底部的scrollview会包含按钮作为浏览html页面的替代方法。该视图imageView2将包含一个透明的头部分遮蔽了底层的webView。 textView helloText将显示章节标题。直到我不得不扩展webView才能处理左右滑动,我完成了所有这些工作。

这里的布局XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    tools:context=".MainActivity" > 

    <RelativeLayout 
     android:id="@+id/relativeLayout1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="0.8" 
     android:orientation="vertical" > 

     <com.example.test.MyWebView 
      android:id="@+id/webView1" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:layout_alignParentLeft="true" 
      android:layout_alignParentTop="true" /> 

     <View 
      android:id="@+id/imageView2" 
      android:layout_width="fill_parent" 
      android:layout_height="50dp" 
      android:layout_alignParentTop="true" 
      android:layout_centerHorizontal="true" 
      android:background="#88FF0000"/> 
    </RelativeLayout> 

    <TextView 
     android:id="@+id/helloText" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="0.05" 
     android:gravity="center_horizontal" 
     android:text="Hello World" /> 

    <HorizontalScrollView 
     android:id="@+id/horizontalScrollView1" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="0.15" 
      android:background="#0000FF" > 

     <LinearLayout 
      android:layout_width="wrap_content" 
      android:layout_height="fill_parent" 
      android:orientation="horizontal" > 

      <Button 
      android:id="@+id/button1" 
      android:layout_width="110dp" 
      android:layout_height="45dp" 
      android:background="#00FF00" /> 

     </LinearLayout> 
    </HorizontalScrollView> 

</LinearLayout> 

,这是代码:

package com.example.test; 

import android.os.Bundle; 
import android.app.Activity; 
import android.content.Context; 
import android.util.AttributeSet; 
import android.util.Log; 
import android.view.GestureDetector; 
import android.view.Menu; 
import android.view.MotionEvent; 
import android.webkit.WebView; 
import android.widget.Toast; 

public class MainActivity extends Activity { 

int currentPage = 2; // page number for current html file 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    //get a pointer to the webview 
    MyWebView webview = (MyWebView) findViewById(R.id.webView1); 

    webview.getSettings().setUseWideViewPort(true); 
    webview.getSettings().setSupportZoom(true); 
    webview.getSettings().setBuiltInZoomControls(true); 

    // put html page in the webView 
    webview.loadUrl("file:///android_asset/chapter" + currentPage + ".html"); 
} 

public void changePage(int page) { 

    Log.v("test", "change page to " + page); 

    //get a pointer to the webview 
    MyWebView webview = (MyWebView)findViewById(R.id.webView1); 

    // put html page in the webView 
    webview.loadUrl("file:///android_asset/chapter" + page + ".html"); 

    } 

class MyWebView extends WebView { 
    Context context; 
    GestureDetector gd; 

    public MyWebView(Context context, AttributeSet attrs) { 
    super(context, attrs); 

    this.context = context; 
     gd = new GestureDetector(context, sogl); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     return (gd.onTouchEvent(event) 
       || super.onTouchEvent(event)); 
    } 

    GestureDetector.SimpleOnGestureListener sogl = new GestureDetector.SimpleOnGestureListener() { 
     public boolean onDown(MotionEvent event) { 
     return false; 
     } 
     public boolean onFling(MotionEvent event1, MotionEvent event2, float velocityX, float velocityY) { 
     if (event1.getRawX() > event2.getRawX() && StrictMath.abs(event1.getRawY()-event2.getRawY())<100) { 
     show_toast("swipe left"); 
     currentPage += 1; 
     if (currentPage >= 19) currentPage = 19; 
     changePage(currentPage); 
     } else if(event1.getRawX() < event2.getRawX() && StrictMath.abs(event1.getRawY()-event2.getRawY())<100){ 
     show_toast("swipe right"); 
     currentPage -= 1; 
     if (currentPage <= 1) currentPage = 1; 
     changePage(currentPage); 
     } else { 
     return false; 
     } 
    return true; 
     } 
    }; 

    void show_toast(final String text) { 
     Toast t = Toast.makeText(context, text, Toast.LENGTH_SHORT); 
     t.show(); 
    } 
    } 
} 

实际的错误读取:

了java.lang.RuntimeException:无法启动活动ComponentInfo { com.example.test/com.example.test.MainActivity}:android.view.InflateException:二进制XML文件行#15:错误膨胀类com.example.test.MyWebView

在此先感谢您的帮助。非常感激。

夹具先生

按照要求完整的错误跟踪:

01-23 10:21:51.980: E/AndroidRuntime(29514): FATAL EXCEPTION: main 
01-23 10:21:51.980: E/AndroidRuntime(29514): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.test/com.example.test.MainActivity}: android.view.InflateException: Binary XML file line #15: Error inflating class com.example.test.MyWebView 
01-23 10:21:51.980: E/AndroidRuntime(29514): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2100) 
01-23 10:21:51.980: E/AndroidRuntime(29514): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2125) 
01-23 10:21:51.980: E/AndroidRuntime(29514): at android.app.ActivityThread.access$600(ActivityThread.java:140) 
01-23 10:21:51.980: E/AndroidRuntime(29514): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1227) 
01-23 10:21:51.980: E/AndroidRuntime(29514): at android.os.Handler.dispatchMessage(Handler.java:99) 
01-23 10:21:51.980: E/AndroidRuntime(29514): at android.os.Looper.loop(Looper.java:137) 
01-23 10:21:51.980: E/AndroidRuntime(29514): at android.app.ActivityThread.main(ActivityThread.java:4898) 
01-23 10:21:51.980: E/AndroidRuntime(29514): at java.lang.reflect.Method.invokeNative(Native Method) 
01-23 10:21:51.980: E/AndroidRuntime(29514): at java.lang.reflect.Method.invoke(Method.java:511) 
01-23 10:21:51.980: E/AndroidRuntime(29514): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006) 
01-23 10:21:51.980: E/AndroidRuntime(29514): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773) 
01-23 10:21:51.980: E/AndroidRuntime(29514): at dalvik.system.NativeStart.main(Native Method) 
01-23 10:21:51.980: E/AndroidRuntime(29514): Caused by: android.view.InflateException: Binary XML file line #15: Error inflating class com.example.test.MyWebView 
01-23 10:21:51.980: E/AndroidRuntime(29514): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:698) 
01-23 10:21:51.980: E/AndroidRuntime(29514): at android.view.LayoutInflater.rInflate(LayoutInflater.java:746) 
01-23 10:21:51.980: E/AndroidRuntime(29514): at android.view.LayoutInflater.rInflate(LayoutInflater.java:749) 
01-23 10:21:51.980: E/AndroidRuntime(29514): at android.view.LayoutInflater.inflate(LayoutInflater.java:489) 
01-23 10:21:51.980: E/AndroidRuntime(29514): at android.view.LayoutInflater.inflate(LayoutInflater.java:396) 
01-23 10:21:51.980: E/AndroidRuntime(29514): at android.view.LayoutInflater.inflate(LayoutInflater.java:352) 
01-23 10:21:51.980: E/AndroidRuntime(29514): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:308) 
01-23 10:21:51.980: E/AndroidRuntime(29514): at android.app.Activity.setContentView(Activity.java:1924) 
01-23 10:21:51.980: E/AndroidRuntime(29514): at com.example.test.MainActivity.onCreate(MainActivity.java:21) 
01-23 10:21:51.980: E/AndroidRuntime(29514): at android.app.Activity.performCreate(Activity.java:5206) 
01-23 10:21:51.980: E/AndroidRuntime(29514): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1083) 
01-23 10:21:51.980: E/AndroidRuntime(29514): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2064) 
01-23 10:21:51.980: E/AndroidRuntime(29514): ... 11 more 
01-23 10:21:51.980: E/AndroidRuntime(29514): Caused by: java.lang.ClassNotFoundException: com.example.test.MyWebView 
01-23 10:21:51.980: E/AndroidRuntime(29514): at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61) 
01-23 10:21:51.980: E/AndroidRuntime(29514): at java.lang.ClassLoader.loadClass(ClassLoader.java:501) 
01-23 10:21:51.980: E/AndroidRuntime(29514): at java.lang.ClassLoader.loadClass(ClassLoader.java:461) 
01-23 10:21:51.980: E/AndroidRuntime(29514): at android.view.LayoutInflater.createView(LayoutInflater.java:552) 
01-23 10:21:51.980: E/AndroidRuntime(29514): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:687) 
01-23 10:21:51.980: E/AndroidRuntime(29514): ... 22 more 
+0

后所有异常跟踪,并MyWebView代码和布局 – Dimmerg

+0

添加这个'公共MyWebView(上下文的背景下){ 超(上下文); //这个构造函数用于以编程方式创建视图 }构造函数也试过,你可以移动自定义web视图来分离.java文件 – Raghunandan

+0

@ Dimmerg:包含所有跟踪请求。 MyWebView代码在发布代码部分中用以下代码行开始:“class MyWebView extends WebView {”布局部分从发布的xml中的行开始:“

MyWebView类是内部MainActivity类的。 Inflater没有看到这个课程。使你的WebView在不同的.java文件中。

您也可以尝试在您的布局文件<com.example.test.MainActivity.MyWebView/>中使用该名称,但我不确定。

+0

我相信代码已经存在。查看扩展了webView类的发布代码。大约四行:“类MyWebView扩展WebView {” –

+0

MyWebView类是MainActivity类的内部。 Inflater没有看到这个课程。使你的WebView在不同的.java文件中。 –

+0

您也可以尝试在布局文件中使用该名称,但我不确定。 –

// try this way 
1. Custom WebView Class 
public class MyWebView extends WebView { 
    Context context; 
    GestureDetector gd; 
    OnPageChangleListener listener; 
    private int currentPage=1; 
    private int startPageIndex; 
    private int lastPageIndex; 

    public MyWebView(Context context) { 
     super(context); 
     init(context); 
    } 

    public MyWebView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(context); 
    } 

    public MyWebView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     init(context); 
    } 

    private void init(Context context){ 
     this.context = context; 
     gd = new GestureDetector(context, sogl); 
    } 


    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     return (gd.onTouchEvent(event) 
       || super.onTouchEvent(event)); 
    } 

    public void setOnPageChangeListener(OnPageChangleListener listener){ 
     this.listener = listener; 
    } 

    public void setStartPageIndex(int startPageIndex){ 
     this.startPageIndex = startPageIndex; 
    } 

    public int getStartPageIndex(){ 
     currentPage = startPageIndex; 
     return startPageIndex; 
    } 

    public int getLastPageIndex(){ 
     return lastPageIndex; 
    } 

    public void setLastPageIndex(int lastPageIndex){ 
     this.lastPageIndex = lastPageIndex; 
    } 
    GestureDetector.SimpleOnGestureListener sogl = new GestureDetector.SimpleOnGestureListener() { 
     public boolean onDown(MotionEvent event) { 
      return false; 
     } 
     public boolean onFling(MotionEvent event1, MotionEvent event2, float velocityX, float velocityY) { 
      if (event1.getRawX() > event2.getRawX() && StrictMath.abs(event1.getRawY()-event2.getRawY())<100) { 
       currentPage += 1; 
       if (currentPage > lastPageIndex){ 
        currentPage = lastPageIndex; 
        show_toast("Last Page"); 
       }else{ 
        show_toast("swipe left"); 
        listener.onPageChange(currentPage); 
       } 
      } else if(event1.getRawX() < event2.getRawX() && StrictMath.abs(event1.getRawY()-event2.getRawY())<100){ 
       currentPage -= 1; 
       if (currentPage < startPageIndex) { 
        currentPage = startPageIndex; 
        show_toast("First Page"); 
       }else{ 
        show_toast("swipe right"); 
        listener.onPageChange(currentPage); 
       } 
      } else { 
       return false; 
      } 
      return true; 
     } 
    }; 

    void show_toast(final String text) { 
     Toast t = Toast.makeText(context, text, Toast.LENGTH_SHORT); 
     t.show(); 
    } 

} 

2. Custom Interface for you Custom WebView page change listener. 
public interface OnPageChangleListener { 
    public void onPageChange(int pageNo); 
} 

3. Use Custom WebView in your Activity. 
MyWebView myWebView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     myWebView = (MyWebView) findViewById(R.id.myWebView); 
     myWebView.getSettings().setUseWideViewPort(true); 
     myWebView.getSettings().setSupportZoom(true); 
     myWebView.getSettings().setBuiltInZoomControls(true); 
     myWebView.setStartPageIndex(2); 
     myWebView.setLastPageIndex(4); 
     myWebView.setOnPageChangeListener(new OnPageChangleListener() { 
      @Override 
      public void onPageChange(int pageNo) { 
       System.out.println(String.valueOf(pageNo)); 
       myWebView.loadUrl("file:///android_asset/" + pageNo + ".html"); 
      } 
     }); 

     myWebView.loadUrl("file:///android_asset/" + myWebView.getStartPageIndex() + ".html"); 

} 
4.main.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"> 
    <com.example.Demo.MyWebView 
     android:id="@+id/myWebView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"/> 
</LinearLayout> 
+0

感谢Haresh,我插入了你的代码,但是这导致了同样的错误。是否有可能是因为我的布局中的MyWebView不在最高层(在顶层的linearlayout内部)而是在相关布局的内部下一层,所以应该调整MyWebView的路径。像com.example.test.RelativeLayout.MyWebView? –

+0

您必须创建自定义WebView类而不是Activity内部类,因此您已在MainActivity中声明为内部类?然后为Custom WebView创建单独的类。 –

+0

感谢您使用示例代码和大大改进的换页机制。不幸的是,你并不是第一次知道该类被隐藏的实际解决方案。 –

请务必添加所有这些构造在自定义的WebView类。

public CustomWebView(Context context) { 
     super(context); 
    } 

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

    public CustomWebView(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

    public CustomWebView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
     super(context, attrs, defStyleAttr, defStyleRes); 
    } 

而且也不要忘记使用XML布局文件这个CustomWebView类与完整的软件包名称

<com.kittykitty.meowmeow.CustomWebView 
       android:id="@+id/my_webview" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       />