2017-02-17 79 views
-6

我有一個問題與方法findViewById(),它在外面活動課使用時始終返回null,我知道我應該後setContentView(R.layout.activity_main)的Android,NullPointerException異常

使用這種方法,但我該如何使用它在我的自定義按鈕,它是在xml中創建的?

對不起,我的英語不好,這是我的第一個問題在堆棧,阿門。 (下面的代碼示例)

<TextView 
    android:id="@+id/textBtn" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Hello World!" /> 

<isen.mytestapl.MyButton 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/myBtn" 
    android:layout_alignTop="@id/textBtn" 
    android:layout_margin="@dimen/activity_vertical_margin"/> 

爲myButton類:

public class MyButton extends Button implements View.OnClickListener{ 

    TextView textView; 

    public MyButton(Context context) { 
    super(context); 
    init(); 
    } 

public MyButton(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    init(); 
} 

public MyButton(Context context, AttributeSet attrs, int defStyleAttr) { 
    super(context, attrs, defStyleAttr); 
    init(); 
} 

public void init(){ 

    setOnClickListener(this); 
} 

@Override 
public void onClick(View view) { 
    try 
    { 
     textView = (TextView) findViewById(R.id.textBtn); 
     textView.setText("It Works!"); 
    } 
    catch (NullPointerException ex){ 
     Log.d("MyLog","NullPointer"); 
    } 
} 
} 
+0

您無法找到組件外部的視圖。 –

+0

Srsly有沒有辦法使用PUBLIC STATIC來獲得這種觀點? – Isen

+1

爲什麼不處理自定義按鈕單擊活動類? – user6650650

回答

0

您的按鈕你不應該設置onClickListener按鈕本身,而是應該在Activity,使設置使用你的兩個按鈕。同樣,在您的示例中,findViewById()找不到TextView,因爲它不在您的按鈕範圍內。在沒有來自您的活動的代碼的情況下,以下是您應該執行的示例:

public void MyActivity extends Activity { 
    TextView textView; 
    MyButton myButton; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main) 

     textView = (TextView) findViewById(R.id.textBtn); 
     myButton = (MyButton) findViewById(R.id.myBtn); 

     myButton.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        textView.setText("It Works!"); 
       } 
     } 
    }  
+0

除了PUBLIC STATIC之外,沒有辦法從外面豐富這個觀點嗎?我雖然處理內點擊自我是一個很好的基調,我的意思是 封裝等......無論我只是有一個巨大的項目,並試圖避免做很多東西在MainActivity類 – Isen

+0

不,[封裝](https:// en .wikipedia.org/wiki/Encapsulation_(computer_programming))本質上意味着每個對象都負責自己,不應該相互依賴於其他對象的特定實例。比方說,例如你想在其他地方重新使用MyButton,在你的例子中,這是不可能的,因爲你有一個依賴於'textView'的實例。 –

+0

同樣,在您的活動中,您希望重寫「onClick」行爲以適應該活動的特定目的。這就是爲什麼在Activity級使用'setOnClickListener'更好,因爲如果你願意,你可以創建'MyButton'的多個實例,每個實例都有不同的'onClick'行爲。 –

相關問題