java - 使用 CardScrollView 的 Google Glass 多嵌入式布局

标签 java android google-glass google-gdk

我正在做的是使用嵌入式布局在 Google Glass 中使用 CardScrollView 插入卡片,因为表格布局在卡片生成器中尚不可用。假设每个表都有 1 个 textView。发生的事情是当我插入 1-3 布局时,没有任何错误,但是当我插入第 4 个布局时,它在这一行中给我一个 java.lang.NullPointerException。

    tv4.setText('Value for table 4');

这是我的代码:

注意:我在每个表中至少有 5 个 TextView。在这里让它变得简单。

    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    createCards();

    mCardScrollView = new CardScrollView(this);
    mAdapter = new ExampleCardScrollAdapter();
    mCardScrollView.setAdapter(mAdapter);
    mCardScrollView.activate();
    setContentView(mCardScrollView);


    TextView tv1 = (TextView) findViewById(R.id.textView1);
    TextView tv2 = (TextView) findViewById(R.id.textView2);
    TextView tv3 = (TextView) findViewById(R.id.textView3);
    TextView tv4 = (TextView) findViewById(R.id.textView4);



    tv1.setText('Value for table 1');
    tv2.setText('Value for table 2');
    tv3.setText('Value for table 3');
    tv4.setText('Value for table 4');
    }

private void createCards(){
    mCards = new ArrayList<CardBuilder>();

     mCards.add(new CardBuilder(this, CardBuilder.Layout.EMBED_INSIDE)
    .setEmbeddedLayout(R.layout.activity_layout1)
    .setFootnote("TABLE 1"));

     mCards.add(new CardBuilder(this, CardBuilder.Layout.EMBED_INSIDE)
    .setEmbeddedLayout(R.layout.activity_layout2)
    .setFootnote("TABLE 2"));

     mCards.add(new CardBuilder(this, CardBuilder.Layout.EMBED_INSIDE)
    .setEmbeddedLayout(R.layout.activity_layout3)
    .setFootnote("TABLE 3"));

     mCards.add(new CardBuilder(this, CardBuilder.Layout.EMBED_INSIDE)
    .setEmbeddedLayout(R.layout.activity_layout4)
    .setFootnote("TABLE 4")); 
    }

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() {
        return CardBuilder.getViewTypeCount();
    }

    @Override
    public int getItemViewType(int position){
        return mCards.get(position).getItemViewType();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        return mCards.get(position).getView(convertView, parent);
    }
}

activity_layout1

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="horizontal" >

<TableRow>

    <TextView
        android:padding="3dip"
        android:textSize="20sp"
        android:text="@string/textViewTitle1"
        android:textColor="@color/muted" />
    <TextView
        android:id="@+id/textView1"
        android:gravity="right"
        android:padding="3dip"
        android:textSize="20sp" />

</TableRow>
</TableLayout>

Activity 布局2

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="horizontal" >

<TableRow>

    <TextView
        android:padding="3dip"
        android:textSize="20sp"
        android:text="@string/textViewTitle2"
        android:textColor="@color/muted" />
    <TextView
        android:id="@+id/textView2"
        android:gravity="right"
        android:padding="3dip"
        android:textSize="20sp" />

</TableRow>
</TableLayout>

activity_layout3

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="horizontal" >

<TableRow>

    <TextView
        android:padding="3dip"
        android:textSize="20sp"
        android:text="@string/textViewTitle4"
        android:textColor="@color/muted" />
    <TextView
        android:id="@+id/textView3"
        android:gravity="right"
        android:padding="3dip"
        android:textSize="20sp" />

</TableRow>
</TableLayout>

activity_layout4

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="horizontal" >

<TableRow>

    <TextView
        android:padding="3dip"
        android:textSize="20sp"
        android:text="@string/textViewTitle4"
        android:textColor="@color/muted" />
    <TextView
        android:id="@+id/textView4"
        android:gravity="right"
        android:padding="3dip"
        android:textSize="20sp" />

</TableRow>
</TableLayout>

适配器

    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() {
        return CardBuilder.getViewTypeCount();
    }

    @Override
    public int getItemViewType(int position){
        return mCards.get(position).getItemViewType();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        return mCards.get(position).getView(convertView, parent);
    }
}

请帮忙,因为我被困在这里好几天了。谢谢你!

最佳答案

您为各种 View 设置文本的方式存在一些问题。

为什么会崩溃

它崩溃的原因是因为 CardScrollView 当前一次检索 5 个 Views,当前一个和两个方向。由于 CardScrollView 从位置 0 开始,因此仅加载位置 0、1 和 2 的 Views:这使得 tv1 的设置文本,tv2tv2 可能,因为它们在 View 层次结构中。

由于 tv4 尚未添加,尝试检索 View 将返回 null

如何解决这个问题

由于 CardScrollView 中的每张卡片都具有相同的布局,因此您无需创建 4 个单独的卡片并在 onCreate 中初始化它们。您应该改为在需要时扩充 Views 并适本地设置文本或其他数据。

card_layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="horizontal" >

<TableRow>

    <TextView
        android:padding="3dip"
        android:textSize="20sp"
        android:text="@string/textViewTitle"
        android:textColor="@color/muted" />
    <TextView
        android:id="@+id/textView"
        android:gravity="right"
        android:padding="3dip"
        android:textSize="20sp" />

</TableRow>
</TableLayout>

适配器:

private class ExampleCardScrollAdapter extends CardScrollAdapter {

    @Override
    public int getPosition(Object item) {
        return mTexts.indexOf(item);
    } 

    @Override
    public int getCount() {
        return mTexts.size();
    }


    @Override
    public Object getItem(int position) {
        return mTexts.get(position);
    }

    @Override
    public int getViewTypeCount() {
        return 1;
    }

    @Override
    public int getItemViewType(int position){
        return CardBuilder.EMBED_INSIDE.ordinal();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = new CardBuilder(this, CardBuilder.Layout.EMBED_INSIDE)
                .setEmbeddedLayout(R.layout.card_layout)
                .setFootnote("TABLE " + position)
                .getView(convertView, parent);
        TextView textView = view.findViewById(R.id.textView);

        textView.setText(mTexts.get(position));
        return view;        
    }
}

然后,在您的 Activity 中:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    createTexts();

    mCardScrollView = new CardScrollView(this);
    mAdapter = new ExampleCardScrollAdapter();
    mCardScrollView.setAdapter(mAdapter);
    mCardScrollView.activate();  // This should be moved in onResume.
    setContentView(mCardScrollView);
}

private void createTexts(){
    mTexts = new ArrayList<String>();

    mTexts.add("Value for table 1");
    mTexts.add("Value for table 2");
    mTexts.add("Value for table 3");
    mTexts.add("Value for table 4");
}

关于java - 使用 CardScrollView 的 Google Glass 多嵌入式布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27913744/

相关文章:

java - 当 war 部署到 AWS 时,HttpServletRequest 的正文为空

java - 如何使用 Wss4jSecurityInterceptor/Spring WS 将时间戳添加到签名

java - eclipse调试时不反编译rt.jar,但idea可以

java - 添加了读取手机状态权限但仍然崩溃

android - BottomSheetBehavior 无法在 viewpager 上折叠

android - Android Wear 上的通知时间

google-mirror-api - 您能否以编程方式获取当前的 Mirror API 配额使用情况?

java - 正则表达式仅匹配 URL 的一部分 - 为什么?

java - 如何检查数组中可能的除数?

node.js - 插入可直接回复的卡