2014-09-27 76 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; 
} 
相關問題