代码问题查找ID和索引

问题描述:

新的编程和Android,所以我真的不知道我在做什么。任何人都可以告诉我为什么这个代码为索引返回-1的不正确值,并为id的10位数字,当我清楚地分配一个id和索引不应该-1,因为它的0基于??代码问题查找ID和索引

我会认为问题是在获取焦点视图的代码中的某个地方,但是我尝试了findFocus和getCurrentFocus,并且都返回相同的东西。这是代码,谢谢!

llmain = (LinearLayout) findViewById(R.id.linearLayoutMain); 
    linflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    int pos = 0; 

    View myView = linflater.inflate(R.layout.action, null); 
    myView.setId(pos); 
    pos++; 
    llmain.addView(myView); 
    myView.requestFocus(); 
    View v = getCurrentFocus(); 
    if(v instanceof EditText) { 
     id = v.getId(); 
     index = llmain.indexOfChild(v); 
     Context context = getApplicationContext(); 
     CharSequence text = "index is:" + index + "id is:" + id; 
     int duration = Toast.LENGTH_SHORT; 

     Toast toast = Toast.makeText(context, text, duration); 
     toast.show(); 
    } 
} 
+0

此代码何时运行?如果在'onCreate'期间,那么焦点可能还没有被分配......此外,'requestFocus'不保证立即授予焦点。 – 2011-05-13 16:06:29

+0

您应该检查'requestFocus'的返回值以确定它成功。另外,当参数不是子视图时,'indexOfChild'返回'-1'。 – 2011-05-13 16:14:30

在android中,视图Id是一个Long,它是该视图的唯一标识符。最好不要通过使用这个数字来引用,而是使用R.id.viewIdSuppliedInLayout这种方式来使用描述性文本,而不是试图保持直接哪些数字指向哪些视图。如果您正在创建动态视图,就像您正在做的那样,它将被分配一个ID,您不必设置它。在你的inflate()方法中,你应该传递R.id.actionsRootViewID作为第二个参数。我的直觉是,这就是为什么indexOf返回-1,因为它找不到你正在寻找的视图。 0将是布局中的第一个视图,因为它没有找到它需要让你知道它未能找到的视图,所以他们选择让它返回-1来表示它。

+0

如果我尝试传递R.id.actionsRootViewID作为第二个参数,它想要将其类型改为R到ViewGroup,这反过来导致出现错误,因为它应该是一个int ...在那里没有更简单的方法来获得已动态创建的选定或重点的edittext的id和索引?我同意它有一个问题找到我正在寻求的观点。 – chris 2011-05-13 19:38:15