2014-09-27 154 views
-1

所以我在这里有这些代码,它运行时不会崩溃。但是,当我将“this”传递给gridadapter时,mContext为null。我尝试通过getApplicationContext(),但仍然无法使getImage方法正常运行,因为getResources.getIdentifier行因为Context为null而不返回任何内容。我很感激,如果有人能教我如何发生这种情况,我该如何解决。谢谢。Android Activity Context is Null

public class ChampionInfo extends FragmentActivity { 

GridView gridtable; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_champion_info); 

    gridtable = (GridView) findViewById(R.id.gridtable);   
    gridtable.setAdapter(new GridAdapter(getApplicationContext())); 

} 

public class GridAdapter extends BaseAdapter { 
    private Context mContext; 

    String[] list = getResources().getStringArray(R.array.championlist); 

    int[] champImage = getImage(); 

    public int[] getImage() { 

     int[] tempImage = new int[list.length]; 

     for (int i = 0; i < list.length; i++) { 
      tempImage[i] = getResources().getIdentifier(list[i], 
        "drawable", getPackageName()); 
     } 

     return tempImage; 

    } 

    // Constructor 
    public GridAdapter(Context c) { 

     mContext = c; 

    } 

    public int getCount() { 
     return champImage.length; 
    } 

    public Object getItem(int position) { 
     return null; 
    } 

    public long getItemId(int position) { 
     return 0; 
    } 

    // create a new ImageView for each item referenced by the Adapter 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ImageView imageView; 
     if (convertView == null) { 
      imageView = new ImageView(mContext); 
      imageView.setLayoutParams(new GridView.LayoutParams(85, 85)); 
      imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
      imageView.setPadding(8, 8, 8, 8); 

     } else { 
      imageView = (ImageView) convertView; 
     } 

     imageView.setImageResource(champImage[position]); 
     return imageView; 
    } 

    // Keep all Images in array 

} 

}

+0

尝试更换此代码:gridtable.setAdapter(新GridAdapter(本)); – 2014-09-27 04:57:34

+0

使用'gridtable.setAdapter(new GridAdapter(ChampionInfo.this));'并阅读http://stackoverflow.com/questions/7298731/when-to-call-activity-context-or-application-context – Raghunandan 2014-09-27 04:57:38

+0

mContext仍然是空值。 – user3370206 2014-09-27 05:02:29

回答

0

问题的根源在于您试图初始化内联的成员变量

int[] champImage = getImage(); 

这个执行之前构造函数将mContext设置为一个有效的值。但是mContextnull这个事实在getImage()的调用中应该是无关紧要的,因为在这种方法中您实际上从未实际使用过mContext

总体问题是您需要小心执行的顺序。

-1

试试这个办法,希望这将帮助你解决你的问题。 (新GridAdapter(本)

2.try找到图像阵列中:

public class ChampionInfo extends FragmentActivity { 


    GridView gridtable; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_champion_info); 

     gridtable = (GridView) findViewById(R.id.gridtable); 
     gridtable.setAdapter(new GridAdapter(this)); 

    } 

    public class GridAdapter extends BaseAdapter { 
     private Context mContext; 
     private String[] list; 
     private int[] champImage; 


     public int[] getImage() { 
      int[] tempImage = new int[list.length]; 
      for (int i = 0; i < list.length; i++) { 
       tempImage[i] = getResources().getIdentifier(list[i], 
         "drawable", getPackageName()); 
      } 
      return tempImage; 

     } 

     public GridAdapter(Context c) { 
      mContext = c; 
      list = getResources().getStringArray(R.array.championlist); 
      champImage = getImage(); 
     } 

     public int getCount() { 
      return champImage.length; 
     } 

     public Object getItem(int position) { 
      return champImage[position]; 
     } 

     public long getItemId(int position) { 
      return position; 
     } 

     // create a new ImageView for each item referenced by the Adapter 
     public View getView(int position, View convertView, ViewGroup parent) { 
      ImageView imageView; 
      if (convertView == null) { 
       imageView = new ImageView(mContext); 
       imageView.setLayoutParams(new GridView.LayoutParams(85, 85)); 
       imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
       imageView.setPadding(8, 8, 8, 8); 

      } else { 
       imageView = (ImageView) convertView; 
      } 

      imageView.setImageResource(champImage[position]); 
      return imageView; 
     } 

     // Keep all Images in array 

    } 
} 

的变化:使用当前活动的上下文参考

1.I具有改变应用程序上下文的当前上下文适配器构造函数而不是类级别

+0

这给了我一个nullpointerexception – user3370206 2014-09-27 05:09:49

+0

哪条线你有null异常? – 2014-09-27 05:12:16

+1

OP声明了一个名为'champImage'的**局部**变量,它隐藏了具有相同名称的成员变量。这里的更改仍然存在相同的错误。 – 2014-09-27 05:15:31

0

试试这个代码将工作

Context mContext; 

GridView gridtable; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_champion_info); 
    mContext=this; 
    gridtable = (GridView) findViewById(R.id.gridtable);   
    gridtable.setAdapter(new GridAdapter(mContext)); 

} 

EDIT1:尝试getActivity()来获取上下文

+0

谢谢,但这并没有奏效; – user3370206 2014-09-27 05:29:18

+0

显示你得到空指针异常的那一行 – Piyush 2014-09-27 05:30:02

+0

这不是得到空指针异常的代码。代码只是运行,它不会崩溃或给出错误。但是mContext只是null。 – user3370206 2014-09-27 05:31:35

1

尝试下面的代码或使用getFragmentManager()getParent();

public class ChampionInfo extends FragmentActivity { 

GridView gridtable; 

Context ctx; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_champion_info); 
    ctx=ChampionInfo.this;//getFragmentManager() or getParent() 
    gridtable = (GridView) findViewById(R.id.gridtable);   
    gridtable.setAdapter(new GridAdapter(ctx)); 

} 

public class GridAdapter extends BaseAdapter { 
    private Context mContext; 

    String[] list = getResources().getStringArray(R.array.championlist); 

    int[] champImage = getImage(); 

    public int[] getImage() { 

     int[] tempImage = new int[list.length]; 

     for (int i = 0; i < list.length; i++) { 
      tempImage[i] = getResources().getIdentifier(list[i], 
        "drawable", getPackageName()); 
     } 

     return tempImage; 

    } 

    // Constructor 
    public GridAdapter(Context c) { 

     mContext = c; 

    } 

    public int getCount() { 
     return champImage.length; 
    } 

    public Object getItem(int position) { 
     return null; 
    } 

    public long getItemId(int position) { 
     return 0; 
    } 

    // create a new ImageView for each item referenced by the Adapter 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ImageView imageView; 
     if (convertView == null) { 
      imageView = new ImageView(mContext); 
      imageView.setLayoutParams(new GridView.LayoutParams(85, 85)); 
      imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
      imageView.setPadding(8, 8, 8, 8); 

     } else { 
      imageView = (ImageView) convertView; 
     } 

     imageView.setImageResource(champImage[position]); 
     return imageView; 
    } 

    // Keep all Images in array 

} 
} 
0

我认为mContext不是null,但getResources()方法返回null。

更改您的代码,如下所示,如果不起作用,请重试。粘贴Logcat,我们可以调试代码。

String[] list = mContext.getResources().getStringArray(R.array.championlist); 

和:

public int[] getImage() { 

    int[] tempImage = new int[list.length]; 

    for (int i = 0; i < list.length; i++) { 
     tempImage[i] = mContext.getResources().getIdentifier(list[i], 
       "drawable", getPackageName()); 
    } 

    return tempImage; 

} 
0
private Context context; 
    private ProgressDialog progressDialog; 

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

    context = this; 
}