0

在我的活动中,我有:

DrawView 是一个自定义相对布局。

这个 RelativeLayout 应该存在一个自定义导航栏和一个自定义 GridView

此处将自定义 NavigationBar 添加到 DrawView:

final LayoutInflater factory = getLayoutInflater();
        final View textEntryView = factory.inflate(R.layout.multiplechoice, null);
        com.lernapp.src.Views.NavigationBarTest navigation = (com.lernapp.src.Views.NavigationBarTest)textEntryView.findViewById(R.id.navigationbar);
        RelativeLayout parent = (RelativeLayout)navigation.getParent();
        parent.removeAllViews();

        drawView.addView(navigation);

我想用 GridView 做类似的事情。

我不明白,我的 CustomGridView 总是为空,这是为什么呢!?

MyCustomGridView grid = (MyCustomGridView)findViewById(R.id.gridview);

xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  android:orientation="vertical"  
  android:layout_width="fill_parent"  
  android:layout_height="fill_parent">  

    <com.lernapp.src.Views.MyCustomGridView  
        android:id="@+id/gridview"  
        android:layout_width="fill_parent"  
        android:layout_height="fill_parent"  
        android:cacheColorHint="#00000000"  
        android:listSelector="@android:color/transparent"  
        android:numColumns="auto_fit"  
        android:columnWidth="160dp"/>  
</LinearLayout>

自定义网格视图:

public class MyCustomGridView extends GridView implements OnItemClickListener{  
      private Listener mListener;  

      public MyCustomGridView(Context context, AttributeSet attrs) {  
        super(context, attrs);  
        setOnItemClickListener(this);  
      }  

      public void onItemClick(AdapterView parent, View v, int position, long id) {  
        if (mListener != null) {  
          mListener.onClick(position);  
        }  
      }  

      public void setListener(Listener l){  
        mListener = l;  
      }  

      public interface Listener{  
        void onClick(int position);   
      }

    }  

编辑:

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

    int height = this.getWindowManager().getDefaultDisplay().getHeight();
    int width = this.getWindowManager().getDefaultDisplay().getWidth();

    MyCustomGridView grid = (MyCustomGridView)findViewById(R.id.gridview);

    DrawView drawView = new DrawView(this, dragFieldText, targetFieldText, height, width, grid);

    final LayoutInflater factory = getLayoutInflater();
    final View textEntryView = factory.inflate(R.layout.multiplechoice, null);
    com.lernapp.src.Views.NavigationBarTest navigation = (com.lernapp.src.Views.NavigationBarTest)textEntryView.findViewById(R.id.navigationbar);
    RelativeLayout parent = (RelativeLayout)navigation.getParent();
    parent.removeAllViews();

    drawView.addView(navigation);

    setContentView(drawView);       
}
4

3 回答 3

3

将此行添加到您的 onCreate 中,一切都会好起来的:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.the_name_of_the_layout_for_this_activity);

并且要非常清楚,它

    setContentView(R.layout.the_name_of_the_layout_for_this_activity);

您应该添加到 onCreate,并且必须在您尝试执行 findViewById() 之前添加它。

于 2012-04-15T09:28:17.780 回答
2

你有2个选择

  1. 你用findViewById. 您正在寻找的视图必须通过使用“在屏幕上” setContentView()。没有其他方法可以解决它,这就是该功能findViewById的用途。
  2. 如果您setContentView()因为想以编程方式设置此视图而无法使用,并且由于某种原因它不在您想要设置的 XML 中,则您必须对视图进行充气,然后用它来发挥您的魔力,然后您就可以随意使用setContentView()了。如何执行此操作的示例很简单,但请查看手册和一些随机示例
于 2012-04-15T09:39:12.450 回答
0

正如 Heinrisch 所说,您需要在使用 findViewById() 之前调用 setContentView。为什么不将自定义相对布局添加到布局 xml?通常你不需要自己膨胀视图。

<com.lernapp.src.Views.DrawView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <com.lernapp.src.Views.MyCustomGridView
        android:id="@+id/gridview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:cacheColorHint="#00000000"
        android:columnWidth="160dp"
        android:listSelector="@android:color/transparent"
        android:numColumns="auto_fit" />
</com.lernapp.src.Views.DrawView>
于 2012-04-15T09:23:12.287 回答