2014-02-28 23 views
0

我已經在其他語言中進行了很多年的專業編碼,但是我在Android上很新,而且我從堆棧溢出等網站學到很多東西。FindByView獲取Button中的EditText click方法返回null

經過數小時的搜索後,我努力嘗試在按鈕單擊方法中獲得對EditText的引用。 EditText和Button都是同一個Activity的一部分。

這裏是我的activity_my.xml的削減部分:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:id="@+id/my_layout" 
    tools:context=".MyActivity" > 
<EditText android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:inputType="textCapWords" 
    android:singleLine="true" 
    android:id="@+id/name" /> 
<Button android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_below="@id/name" 
    android:text="@string/save" 
    android:id="@+id/save" /> 
</RelativeLayout> 

而且我MyActivity.java的削減部分:

public class MyActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(getLayoutInflater().inflate(R.layout.activity_my, null)); 

     findViewById(R.id.save).setOnClickListener(new View.OnClickListener() { 
      public void onClick(View view) { 
       saveClick(view); 
      } 
     }); 
    } 

    public void saveClick(View view) 
    { 
     EditText editText = (EditText) view.findViewById(R.id.name); // this is always null 
     if (editText != null) 
     { 
      String name = editText.getText().toString(); 
     } 
    } 
} 

我想這是因爲我試圖使用view參數上的findViewById方法。我記得在某處閱讀按鈕點擊事件的參數是按鈕本身,而不是佈局。如果這是正確的,我如何獲得對佈局的引用以便使用findViewById方法?或者還有其他問題嗎?

我見過的例子中,onClick事件包裝了一個匿名方法,您可以成功使用findViewById,因爲(我認爲)您基本上嵌套在onCreate事件中。但是,我想保留我的按鈕單擊事件作爲一個單獨的(非匿名)方法。

感謝您提前提供任何幫助。

回答

2

更改此

EditText editText = (EditText) view.findViewById(R.id.name); 

EditText editText = (EditText)findViewById(R.id.name); 

,你可以簡單地直接使用

setContentView(R.layout.activity_my); 

我猜的EditText屬於activity_my.xml

也沒有必要初始化按鈕的EditText每次點擊

EditText editText;// declare as instance variable 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_my); 
    editText = (EditText) view.findViewById(R.id.name) 
1

使用本

EditText editText = (EditText) findViewById(R.id.name); 
1
public void saveClick(View view) 
    { 
     EditText editText = (EditText) view.findViewById(R.id.name); // this is always null 
     if (editText != null) 
     { 
      String name = editText.getText().toString(); 
     } 
    } 

返回一個有效Viewobject != null)只有EditTextButton之內。您應該在查看的層次結構中查找EditText

0

View.findViewById()方法查找的意見。

就你而言,findViewById調用位於edittext視圖的onClickListener中。這個視圖沒有孩子,這是一個簡單的編輯文本。這就是爲什麼你得到空。