2017-02-17 11 views
-6

私は方法findViewById()に問題があるが、それは常にnullを返し、私はsetContentView(R.layout.activity_main)アンドロイド、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

このビューを取得するためにPUBLIC STATICを使用する方法はありませんか? – Isen

+1

アクティビティクラスでカスタムボタンのクリックを処理しない理由は何ですか? – user6650650

答えて

0

あなたが代わりにそれを作るActivityに設定する必要があり、ボタン自体の中にあなたのボタンのonClickListenerを設定すべきではありません両方のボタンの使用。同様に、例のfindViewById()は、ボタンと同じスコープ内にないため、TextViewを見つけることができません。アクティビティのコードがない場合は、次のような操作を行ってください。

+0

PUBLIC STATIC以外にもこのビューを外部から豊かにする方法はありませんか?私はそれの中でクリックを処理することは良い音です、私は意味します カプセル化など...私はちょうど巨大なプロジェクトを持って、MainActivityクラスのものをたくさんするのを避けようとしました – Isen

+0

いいえ、[カプセル化](https:// en .wikipedia.org/wiki/Encapsulation_(computer_programming))は、本質的に、各オブジェクトがそれ自身を担当し、他のオブジェクトの特定のインスタンスに相互依存してはならないことを意味します。例えば、 'MyButton'をどこか別の場所に再利用したいとしましょう。あなたの例では、' textView'のインスタンスに依存するので、これは不可能です。 –

+0

同様に、あなたのアクティビティでは、そのアクティビティの特定の目的に合うように 'onClick'ビヘイビアをオーバーライドする必要があります。そのため、必要に応じて 'onClick'ビヘイビアを持つ' MyButton'のインスタンスを複数作成することができるので、 'setOnClickListener'をアクティビティレベルで使用する方が良いでしょう。 –

関連する問題