Ява к Kotlin доступ к специфическим переменным класса в различных методах - PullRequest
0 голосов
/ 04 июля 2018

Я из Objective-C фона. Я должен создавать объекты программно, поэтому пытаюсь исследовать его на Java и в Kotlin.

В Objective-C Мы использовали для объявления переменных экземпляра в файлах .h и доступа к ним в любом месте файла .m, есть ли какой-то похожий интерфейс, где мы объявляем переменные и типы объектов где-то, а затем обращаемся к ним в нашем классе kotlin

Я пытаюсь объявить переменную, к которой у меня есть доступ к различным методам внутри класса (например, MainActivity). В Java это работает нормально, однако в Kotlin, я думаю, у меня возникают проблемы с объявлением его без инициализации. Нужна помощь.

//Here is the Java Code that works fine.
public class MainActivity extends AppCompatActivity {

    **LinearLayout box;**

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

        **box = new LinearLayout(this);**

    }

    private void SampleMethod () {
        **box.setBackgroundColor(Color.RED);**
     }
   }

Если я пытаюсь добиться этого в Kotlin, приложение останавливается с ОШИБКОЙ, предоставленной в stacktrace.

//Here is Kotlin code that is stopping the app. 
class MainActivity : AppCompatActivity() {

   **val sample = TextView(this)** // I need to declare variable here.

   override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    **sample.setText("Hello!")**
    MainContainer.addView(sample)
   }

 fun Test() {
    **sample.setBackgroundColor(Color.RED)**
 }
}

Вот стэк-след

07-04 13:16:14.690 12663-12663/? I/zygote: Not late-enabling -Xcheck:jni (already on)
07-04 13:16:15.230 12663-12663/? W/zygote: Unexpected CPU variant for X86 using defaults: x86
07-04 13:16:16.639 12663-12663/com.example.sample.kotlinproject I/InstantRun: starting instant run server: is main process
07-04 13:16:16.938 12663-12663/com.example.sample.kotlinproject D/AndroidRuntime: Shutting down VM
07-04 13:16:16.940 12663-12663/com.example.sample.kotlinproject E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.sample.kotlinproject, PID: 12663
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.sample.kotlinproject/com.example.sample.kotlinproject.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2679)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
    at android.app.ActivityThread.-wrap11(Unknown Source:0)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6494)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference
    at android.content.ContextWrapper.getResources(ContextWrapper.java:89)
    at android.view.ContextThemeWrapper.getResourcesInternal(ContextThemeWrapper.java:127)
    at android.view.ContextThemeWrapper.getResources(ContextThemeWrapper.java:121)
    at android.support.v7.app.AppCompatActivity.getResources(AppCompatActivity.java:542)
    at android.view.View.<init>(View.java:4563)
    at android.view.View.<init>(View.java:4706)
    at android.view.ViewGroup.<init>(ViewGroup.java:597)
    at android.widget.LinearLayout.<init>(LinearLayout.java:234)
    at android.widget.LinearLayout.<init>(LinearLayout.java:230)
    at android.widget.LinearLayout.<init>(LinearLayout.java:226)
    at android.widget.LinearLayout.<init>(LinearLayout.java:222)
    at com.example.sample.kotlinproject.MainActivity.<init>(MainActivity.kt:18)
    at java.lang.Class.newInstance(Native Method)
    at android.app.Instrumentation.newActivity(Instrumentation.java:1174)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2669)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856) 
    at android.app.ActivityThread.-wrap11(Unknown Source:0) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589) 
    at android.os.Handler.dispatchMessage(Handler.java:106) 
    at android.os.Looper.loop(Looper.java:164) 
    at android.app.ActivityThread.main(ActivityThread.java:6494) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 

1 Ответ

0 голосов
/ 04 июля 2018
class MainActivity : AppCompatActivity() {


   val sample = TextView(this)

Это не сработает - и ваша книга по Android или учебник должны объяснить причину. Недостаточно создать экземпляр AppCompatActivity с помощью конструктора, чтобы получить полноценный экземпляр Activity.

В целом, вероятно, лучше подождать до onCreate, прежде чем пытаться программно создать экземпляр представления.

class MainActivity : AppCompatActivity() {

    lateinit var myTextView: TextView

    override fun onCreate(savedInstanceState: Bundle) {
        //instantiate myTextView here if you must 
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...