2011-05-13 73 views
0

新的編程和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

回答

1

在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