簡體   English   中英

構造函數中的參數是什么(上下文,屬性)? 我如何創建新的 object 這個 class? Java 和 Kotlin

[英]What is parameters in constructor (context, attrs)? How I can create new object this class? Java and Kotlin

我嘗試創建聲譜,我創建了 class 視圖,它顯示了頻譜,但為了它的工作,我必須創建新的 object 這個 class

我的觀點 class:

class WaveformView(context: Context?, attrs: AttributeSet?) : View(context, attrs) {
    private var paint = Paint()
    private var amplitudes = ArrayList<Float>()
    private var spikes = ArrayList<RectF>()
    private var radius = 6f
    private var w = 9f
    init {
        paint.color = (Color.rgb(244, 81,30))
    }
    fun addAmplitude(amp: Float){
        amplitudes.add(amp)

        var left = 0f
        var top = 0f
        var right = left + w
        var bottom = amp

        spikes.add(RectF(left, top, right, bottom))
    }

    override fun draw(canvas: Canvas?) {
        super.draw(canvas)
        /*canvas?.drawRoundRect(RectF(20f, 30f, 20+30f, 30f + 60f), 6f, 6f, paint)
        canvas?.drawRoundRect(RectF(60f, 60f, 60+80f, 60f + 360f), 6f, 6f, paint)*/
        spikes.forEach{
            canvas?.drawRoundRect(it, radius, radius, paint)
        }
    }

我的總機 class:

//Volume
    MediaRecorder mediaRecorder;
    WaveformView waveform = new WaveformView(MainActivity.this, null); <--- Error


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);..............

我寫在 Kotlin class 查看,但 MainAct 我寫在 Java(我現在不是 Kotlin,但我找到了決定)

我需要創建一個新的 object 才能使用它

public void startRecording() {
        requestPerms();
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED) {
            mediaRecorder = new MediaRecorder();
            mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
            mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);

            waveform.addAmplitude(mediaRecorder.getMaxAmplitude()); <---here
        } else {
        Toast.makeText(this, "Sorry, your MIC don't work", Toast.LENGTH_SHORT).show();
        }
    }

我的錯誤:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.imagewithcamera, PID: 889
    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.imagewithcamera/com.example.imagewithcamera.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:3737)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4022)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2336)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:246)
        at android.app.ActivityThread.main(ActivityThread.java:8653)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
     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:101)
        at android.view.ContextThemeWrapper.getResourcesInternal(ContextThemeWrapper.java:134)
        at android.view.ContextThemeWrapper.getResources(ContextThemeWrapper.java:128)
        at android.support.v7.app.AppCompatActivity.getResources(AppCompatActivity.java:543)
        at android.view.View.<init>(View.java:5682)
        at android.view.View.<init>(View.java:5886)
        at android.view.View.<init>(View.java:5849)
        at android.view.View.<init>(View.java:5828)
        at com.example.imagewithcamera.WaveformView.<init>(WaveformView.kt:11)
        at com.example.imagewithcamera.MainActivity.<init>(MainActivity.java:62)
        at java.lang.Class.newInstance(Native Method)
        

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

我找到答案,我創造

waveform = findViewById(R.id.waveformView); 

這是觀點)))

而不是使用主構造函數使用輔助構造函數構造constructor(context: Context?, attrs: AttributeSet?)並將object正常方式定義為kotlin

val wview=波形視圖(上下文)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM