将卡片定义为 WebView,同时仍然使用 CardScrollView:Google Glass
Defining cards as WebViews while still using CardScrollView: Google Glass
我正在尝试开发一个简单的 Glass 示例 (Immersion),其中每张卡片全屏显示一个 WebView (不 CardBuilder.Layout.EMBED_INSIDE).
我正在关注这个答案:
Google Glass Immersion Custom Layout without CardBuilder.Layout.EMBED_INSIDE 但不清楚在哪里设置网络视图。
我的代码如下:
public class MainActivity extends Activity
{
private String cardPageOne = "file:///android_asset/one.html";
private String cardPageTwo = "file:///android_asset/two.html";
private CardScrollView mCardScrollView;
private ExampleCardScrollAdapter mAdapter;
private List<View> mCards;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
createCards(); // Setup webviews
mCardScrollView = new CardScrollView(this);
mAdapter = new ExampleCardScrollAdapter();
mCardScrollView.setAdapter(mAdapter);
mCardScrollView.activate();
setContentView(mCardScrollView);
}
private void createCards()
{
mCards = new ArrayList<>();
WebView myWeb = (WebView)findViewById(R.id.webView);
myWeb.getSettings().setJavaScriptEnabled(false);
myWeb.loadUrl(filePath);
mCards.add(myWeb);
WebView myWeb2 = (WebView)findViewById(R.id.webView);
myWeb2.getSettings().setJavaScriptEnabled(false);
myWeb2.loadUrl(filePathAlt);
mCards.add(myWeb2);
}
private class ExampleCardScrollAdapter extends CardScrollAdapter
{
@Override
public int getPosition(Object item)
{
return mCards.indexOf(item);
}
@Override
public int getCount()
{
return mCards.size();
}
@Override
public Object getItem(int position)
{
return mCards.get(position);
}
@Override
public int getViewTypeCount()
{
// Is this correct? Each card will have a different (web)view
return mCards.size();
}
@Override
public int getItemViewType(int position)
{
// Is this correct?
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
return mCards.get(position);
}
}
}
最后,我的webview.xml如下:
<?xml version="1.0" encoding="utf-8"?>
<WebView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/webView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"></WebView>
一旦代码到达,我就会收到 java.lang.NullPointerException:
myWeb.getSettings().setJavaScriptEnabled(false);
我认为这是因为 myWeb 尚未设置为 内容视图 ,因为我正在使用 mCardScrollView。如果是这样,我可以在哪里以及如何设置我的 webviews?
详细错误是:
07-13 17:24:05.337 18117-18117/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.testwebviewscroller, PID: 18117
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.testwebviewscroller/com.testwebviewscroller.MainActivity}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2224)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2273)
at android.app.ActivityThread.access0(ActivityThread.java:138)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1236)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:149)
at android.app.ActivityThread.main(ActivityThread.java:5045)
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:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at com.testwebviewscroller.MainActivity$ExampleCardScrollAdapter.getView(MainActivity.java:101)
at com.google.android.glass.widget.CardScrollView.loadView(CardScrollView.java:1351)
at com.google.android.glass.widget.CardScrollView.addChildView(CardScrollView.java:1239)
at com.google.android.glass.widget.CardScrollView.updateViewsInternal(CardScrollView.java:1131)
at com.google.android.glass.widget.CardScrollView.updateViews(CardScrollView.java:1193)
at com.google.android.glass.widget.CardScrollView.activate(CardScrollView.java:1589)
at com.testwebviewscroller.MainActivity.onCreate(MainActivity.java:40)
at android.app.Activity.performCreate(Activity.java:5235)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1089)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2188)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2273)
at android.app.ActivityThread.access0(ActivityThread.java:138)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1236)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:149)
at android.app.ActivityThread.main(ActivityThread.java:5045)
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:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
at dalvik.system.NativeStart.main(Native Method)
如果您想将 webview 放入您的卡片中,为什么不直接将您自己的视图扩展到 getView()
覆盖方法中的每个项目中?如果您不打算使用卡片提供的布局,您不妨创建一个新布局并使用它。您的 getView()
看起来像这样:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater layoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = layoutInflater.inflate(R.layout.webview, parent, false);
//enter code here to handle custom view loading
return convertView;
}
我正在尝试开发一个简单的 Glass 示例 (Immersion),其中每张卡片全屏显示一个 WebView (不 CardBuilder.Layout.EMBED_INSIDE).
我正在关注这个答案: Google Glass Immersion Custom Layout without CardBuilder.Layout.EMBED_INSIDE 但不清楚在哪里设置网络视图。
我的代码如下:
public class MainActivity extends Activity
{
private String cardPageOne = "file:///android_asset/one.html";
private String cardPageTwo = "file:///android_asset/two.html";
private CardScrollView mCardScrollView;
private ExampleCardScrollAdapter mAdapter;
private List<View> mCards;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
createCards(); // Setup webviews
mCardScrollView = new CardScrollView(this);
mAdapter = new ExampleCardScrollAdapter();
mCardScrollView.setAdapter(mAdapter);
mCardScrollView.activate();
setContentView(mCardScrollView);
}
private void createCards()
{
mCards = new ArrayList<>();
WebView myWeb = (WebView)findViewById(R.id.webView);
myWeb.getSettings().setJavaScriptEnabled(false);
myWeb.loadUrl(filePath);
mCards.add(myWeb);
WebView myWeb2 = (WebView)findViewById(R.id.webView);
myWeb2.getSettings().setJavaScriptEnabled(false);
myWeb2.loadUrl(filePathAlt);
mCards.add(myWeb2);
}
private class ExampleCardScrollAdapter extends CardScrollAdapter
{
@Override
public int getPosition(Object item)
{
return mCards.indexOf(item);
}
@Override
public int getCount()
{
return mCards.size();
}
@Override
public Object getItem(int position)
{
return mCards.get(position);
}
@Override
public int getViewTypeCount()
{
// Is this correct? Each card will have a different (web)view
return mCards.size();
}
@Override
public int getItemViewType(int position)
{
// Is this correct?
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
return mCards.get(position);
}
}
}
最后,我的webview.xml如下:
<?xml version="1.0" encoding="utf-8"?>
<WebView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/webView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"></WebView>
一旦代码到达,我就会收到 java.lang.NullPointerException:
myWeb.getSettings().setJavaScriptEnabled(false);
我认为这是因为 myWeb 尚未设置为 内容视图 ,因为我正在使用 mCardScrollView。如果是这样,我可以在哪里以及如何设置我的 webviews?
详细错误是:
07-13 17:24:05.337 18117-18117/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.testwebviewscroller, PID: 18117
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.testwebviewscroller/com.testwebviewscroller.MainActivity}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2224)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2273)
at android.app.ActivityThread.access0(ActivityThread.java:138)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1236)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:149)
at android.app.ActivityThread.main(ActivityThread.java:5045)
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:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at com.testwebviewscroller.MainActivity$ExampleCardScrollAdapter.getView(MainActivity.java:101)
at com.google.android.glass.widget.CardScrollView.loadView(CardScrollView.java:1351)
at com.google.android.glass.widget.CardScrollView.addChildView(CardScrollView.java:1239)
at com.google.android.glass.widget.CardScrollView.updateViewsInternal(CardScrollView.java:1131)
at com.google.android.glass.widget.CardScrollView.updateViews(CardScrollView.java:1193)
at com.google.android.glass.widget.CardScrollView.activate(CardScrollView.java:1589)
at com.testwebviewscroller.MainActivity.onCreate(MainActivity.java:40)
at android.app.Activity.performCreate(Activity.java:5235)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1089)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2188)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2273)
at android.app.ActivityThread.access0(ActivityThread.java:138)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1236)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:149)
at android.app.ActivityThread.main(ActivityThread.java:5045)
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:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
at dalvik.system.NativeStart.main(Native Method)
如果您想将 webview 放入您的卡片中,为什么不直接将您自己的视图扩展到 getView()
覆盖方法中的每个项目中?如果您不打算使用卡片提供的布局,您不妨创建一个新布局并使用它。您的 getView()
看起来像这样:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater layoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = layoutInflater.inflate(R.layout.webview, parent, false);
//enter code here to handle custom view loading
return convertView;
}