96516


javaの基本的な構文は学習済みで、classを使用する際には下記記述を使用していました。

[code]

    #class definition
    public class Temp{
        public TempConst{
            (...)
        }
        public tempMethod(){
            (...)
        }
    }
    
[/code]

[code]

    #instantiate
    Temp t = new Temp();
    #executing method
    t.Temp();
    
[/code]

という構文を学習しました。

しかし、現在学習しているandroidアプリ開発の書籍では、widgetクラス(EditText,
TextView等)のインスタンス化をせずに使用している為、なぜそのようなことができるのかご教示いただきたく思います。  
該当コードは下記です

[code]

    public class MainActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            (...)
        }
    
        private class TempLister implements View.OnClickListener{
            @Override
            public void onClick(View view){
                EditText input = findViewById(R.id.etName);
                String inputStr = input.getText().toString();
    
                output.setText(inputStr + "さん、こんにちは");
            }
        }
    }
    
[/code]

因みにStringクラスはstaticなメソッドなのでnewが必要ないことは理解できています。

ご回答と同時にリファレンスのどの部分を見れば理解できるか等のアドバイスもいただけると大変ありがたく思います。よろしくお願いいたします。


CC BY-SA 4.0
2023-10-18T08:15:13.980
96514
2023-10-18T09:55:04.673
60137
question
java android class
Androidのwidgetクラス(EditText, TextView等)について。newでインスタンス化しなくてもよいのはなぜですか。


それは Java 言語自体の仕様というよりは、Android API の次元の話ですね。

公式リファレンスによると、[`AppCompatActivity#findViewById`](https://developer.android.com/reference/androidx/appcompat/app/AppCompatActivity#findViewById\(int\))
は

> `public T <T extends View> findViewById(@IdRes int id)`

と定義されていますから、返り値として `View` の派生クラス（`EditText` 等）が得られることが、API によって保障されています。

つまり、Java 言語的には、Android API が水面下の処理で `new` して用意した、`EditText` 等が、`findViewById`
メソッドの実行結果として返されるというわけです。

`findViewById` で見つける（find する）ことができる View Widget は、`onCreate` で（`layout.xml`
から）レイアウトとしてインフレートしてコンテント View として設定（`setContentView`）済のものに限られます。

自分で、直接、Java 言語的に `new` して、後付けで View Widget を `setContentView` したり `addView`
することも、もちろん可能です。

[code]

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        TextView textView = new TextView(this);
        textView.setText("aiueo");
        
        setContentView(textView);
    }
    
[/code]


CC BY-SA 4.0
2023-10-18T09:40:58.147
96516
2023-10-18T09:55:04.673
2023-10-18T09:55:04.673
7290
7290
96514
answer