【问题标题】:how to access inner class variable in outer class method in java如何在java的外部类方法中访问内部类变量
【发布时间】:2013-05-07 06:15:09
【问题描述】:

我想在外部类方法中访问内部类 Hashmap 变量意味着项目选择的微调器侦听器。我在内部类中声明了 Hashmap,并且我在内部类方法中的 Hashmap 中赋值。我正在使用外部类中的 setOnItemSelectedListener 中的键访问哈希图值,但我在哈希图中得到了空值。
我在外部类中设置了静态哈希图,并将值放入内部类中,然后再次从外部类侦听器访问,但再次获得空值。如果有人有其他解决方案,请告诉我。我在这里有点困惑。我不知道我错在哪里。请大家有解决办法。

下面是外部类和内部类

public class ProjectDetailActivity extends SherlockActivity {

// declare hashmap.
HashMap<String, String> phaseIdKv = new HashMap<String, String>();
@Override
protected void onCreate(Bundle savedInstanceState) {

    new LoadPhaseData().execute(projId);
    //create variable of inner class
    final ProjectDetailActivity.LoadPhaseData inner = new ProjectDetailActivity().new LoadPhaseData(); 

   //Listener for Phase spinner

    projSpinnerPhase.setOnItemSelectedListener((OnItemSelectedListener) new OnItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> arg0, View arg1,
                int arg2, long arg3) {

            int id = projSpinnerPhase.getSelectedItemPosition();
            ++id;
            String p_id= inner.phaseIdKv.get(id); //Here I want to access inner class hashmap value
            Log.v("hashmap value","-"+inner.phaseIdKv.get(id));//getting null

            Toast.makeText(getApplicationContext(),"item-"+id+" item2"+item+"p_id"+p_id, Toast.LENGTH_LONG).show();
        }

    });     
}
private class LoadPhaseData extends AsyncTask<String, Void, Void> {


    @Override
    protected Void doInBackground(String... params) {
        -----
        JSONArray phaseData = new JSONArray(jsonpPhaseList);
            String [] phaseNo = new String[jsonpPhaseList.length()];
            String phase;
            String phaseId1;
            if (phaseData.length() >0) {
                for(int i =0;i<phaseData.length();i++){
                    JSONObject joPhasefromJa = phaseData.getJSONObject(i);

                    phase = joPhasefromJa.getString("phase_no")
                    phaseId1 = joPhasefromJa.getString("phase_id");

                    phaseIdKv.put(phase,phaseId1);                  
                }
            }
        return null;
    }

【问题讨论】:

标签: java android


【解决方案1】:

在外部范围内声明要访问的变量

public class ProjectDetailActivity extends SherlockActivity {
 String p_id;

 ...


    projSpinnerPhase.setOnItemSelectedListener((OnItemSelectedListener) new OnItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> arg0, View arg1,
                int arg2, long arg3) {

            int id = projSpinnerPhase.getSelectedItemPosition();
            ++id;
            p_id= inner.phaseIdKv.get(id); //Here I want to access inner class hashmap value
            Log.v("hashmap value","-"+inner.phaseIdKv.get(id));//getting null

            Toast.makeText(getApplicationContext(),"item-"+id+" item2"+item+"p_id"+p_id, Toast.LENGTH_LONG).show();
        }

    });   

 ....

}

【讨论】:

  • 我不明白你说什么?
  • 你有内部类作用域变量和外部类作用域变量。在外部类作用域中声明的变量对内部类是可见的。既然要在外部类中访问p_id,就在外部类中声明
【解决方案2】:

问题是 phaseNo[index] 未初始化。它为空。你的钥匙是空的

还有

     HashMap<String, String> phaseIdKv = new HashMap<String, String>();

键值对作为字符串的哈希映射

      //phaseNo is a string array.
      for(int i =0;i<phaseData.length();i++){ 
       phase = joPhasefromJa.getString("phase_no")
       phaseId1 = joPhasefromJa.getString("phase_id");
       phaseIdKv.put(phase ,phaseId1);  
      }

得到

     int id = projSpinnerPhase.getSelectedItemPosition();
     ++id;
     String p_id= phaseIdKv.get(String.valueOf(id));// convert int to string
     id should match phase that is the key put in hash map

如果你想在类中的任何地方访问 p_id,请将其声明为外部类变量。

【讨论】:

  • phaseNo 在这里不为空,因为我确实使用 Log.v("PhaseNo[i]","-"+phase) 之类的日志检查了这个值,它的打印很好,而且我的哈希图也正确填充带有数据键值对。一切都正确放置在内部类中,但我无法在外部类中访问。请查看更新后的问题
  • @nileshwani 在编辑 PhaseNo[i] 之前被初始化。它是空的。在您的情况下,Hashmap 采用字符串的键值对。因此,当您获取值时,请使用字符串作为键。并保留旧帖子,以免误导访问该帖子的人。您做了这个 phaseIdKv.put(phaseNo[i],phaseId1);并且这个 phaseNo[i] 没有被初始化
  • 谢谢,当我在代码中编写 String.valueOf(id) 时效果很好。但我不明白为什么这项工作现在你能解释一下。
  • 您的密钥是我在上面评论中提到的字符串。而你使用的 id 是 int。所以你需要将 int 转换为 string,然后使用 key 获取 value。 HashMap phaseIdKv = new HashMap();字符串的哈希映射键值对,键是字符串,值是字符串。如果有帮助,请接受并投票回答
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-06
相关资源
最近更新 更多