如何在父活动中访问片段布局?

时间:2015-06-11 14:02:00

标签: java android android-fragments gridview baseadapter

我有一个tabpager和片段。一个frament有一个“GridView”。我在片段父活动中使用 basedapter innerclass

但是当我想将适配器设置为我的gridview时,我得到 nullpointerexception 。因为GridView变量总是为null.ow可以解决这个问题吗?

Fragment Parent MainActivity OnCreate Method;

GridView gv = (GridView)findViewById(R.id.gridview); // debugging and always null
gv.setAdapter(new AdapterB(this,WallPaperList)); 

片段xml

<!-- TODO: Update blank fragment layout -->
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/gridview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:numColumns="auto_fit"
    android:verticalSpacing="10dp"
    android:horizontalSpacing="10dp"
    android:columnWidth="90dp"
    android:stretchMode="columnWidth"
    android:gravity="center"
    />

MyGrid.xml(用于填充适配器)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">
    <ImageView
        android:id="@+id/imagepart"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"/>

    <CheckBox
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Seç"
        android:id="@+id/checkBox" />
</LinearLayout>

2 个答案:

答案 0 :(得分:0)

您无法访问这样的片段视图,因为它们可能尚未出现在活动视图层次结构中。

您必须在片段中添加一些方法,例如

myCustomFragment.setGridAdapter(MyCustomGridViewAdapter adapter)

并在自定义片段中使用此方法:

public void setGridAdapter(){
    this.myCustomGridAdapter = adapter;
    GridView gv = (GridView)findViewById(R.id.gridview); 

    if(gv != null)
        gv.setAdapter(this.myCustomGridAdapter);
}

答案 1 :(得分:0)

此代码:

GridView gv = (GridView)findViewById(R.id.gridview); // debugging and always null
gv.setAdapter(new AdapterB(this,WallPaperList)); 

应该在您的片段onCreateView内。您应该创建独立于他们所附加活动的片段。

如果您确实需要从活动中访问片段的布局,则需要延迟findViewById,因为片段的布局在您调用时尚未充气:

new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        GridView gv = (GridView)findViewById(R.id.gridview);
        gv.setAdapter(new AdapterB(this, WallPaperList));
    }
}, 1000);

虽然这段代码可以使用,但我强烈建议您不要使用它!