>

대학 프로젝트에서이 코드를 실험하고 있습니다. 이 코드는 "LinearLayout"을 사용하여 XML 디자인 편집기에서 요소를 자유롭게 이동하지 못하도록 제한하므로 변경 사항을 Java의 선형 레이아웃으로 덮어 씁니다. 이 코드를 어떻게 재구성 할 수 있습니까?

클래스 : MainActivity.java :

package com.android.audiorecordtest;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.text.Layout;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {
    private static final String LOG_TAG = "AudioRecordTest";
    private static final int REQUEST_RECORD_AUDIO_PERMISSION = 200;
    private static String fileName = null;
    private RecordButton recordButton = null;
    private MediaRecorder recorder = null;
    private PlayButton   playButton = null;
    private MediaPlayer   player = null;
    // Requesting permission to RECORD_AUDIO
    private boolean permissionToRecordAccepted = false;
    private String [] permissions = {Manifest.permission.RECORD_AUDIO};
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode){
            case REQUEST_RECORD_AUDIO_PERMISSION:
                permissionToRecordAccepted  = grantResults[0] == PackageManager.PERMISSION_GRANTED;
                break;
        }
        if (!permissionToRecordAccepted ) finish();
    }
    private void onRecord(boolean start) {
        if (start) {
            startRecording();
        } else {
            stopRecording();
        }
    }
    private void onPlay(boolean start) {
        if (start) {
            startPlaying();
        } else {
            stopPlaying();
        }
    }
    private void startPlaying() {
        player = new MediaPlayer();
        try {
            player.setDataSource(fileName);
            player.prepare();
            player.start();
        } catch (IOException e) {
            Log.e(LOG_TAG, "prepare() failed");
        }
    }
    private void stopPlaying() {
        player.release();
        player = null;
    }
    private void startRecording() {
        recorder = new MediaRecorder();
        recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        recorder.setOutputFile(fileName);
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        try {
            recorder.prepare();
        } catch (IOException e) {
            Log.e(LOG_TAG, "prepare() failed");
        }
        recorder.start();
    }
    private void stopRecording() {
        recorder.stop();
        recorder.release();
        recorder = null;
    }
    class RecordButton extends Button {
        boolean mStartRecording = true;
        OnClickListener clicker = new OnClickListener() {
        public void onClick(View v) {
            onRecord(mStartRecording);
            if (mStartRecording) {
                setText("Stop recording");
            } else {
                setText("Start recording");
            }
            mStartRecording = !mStartRecording;
        }
    };
        public RecordButton(Context ctx) {
            super(ctx);
            setText("Start recording");
            setOnClickListener(clicker);
        }
    }
    class PlayButton extends Button {
        boolean mStartPlaying = true;
        OnClickListener clicker = new OnClickListener() {
            public void onClick(View v) {
                onPlay(mStartPlaying);
                if (mStartPlaying) {
                    setText("Stop playing");
                } else {
                    setText("Start playing");
                }
                mStartPlaying = !mStartPlaying;
            }
        };
        public PlayButton(Context ctx) {
            super(ctx);
            setText("Start playing");
            setOnClickListener(clicker);
        }
    }
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        // Record to the external cache directory for visibility
        fileName = getExternalCacheDir().getAbsolutePath();
        fileName += "/audiorecordtest.3gp";
        ActivityCompat.requestPermissions(this, permissions, REQUEST_RECORD_AUDIO_PERMISSION);
        LinearLayout ll = new LinearLayout(this);
        recordButton = new RecordButton(this);
        ll.addView(recordButton,
                new LinearLayout.LayoutParams(
                        ViewGroup.LayoutParams.WRAP_CONTENT,
                        ViewGroup.LayoutParams.WRAP_CONTENT, 0));
        playButton = new PlayButton(this);
        ll.addView(playButton,
                new LinearLayout.LayoutParams(
                        ViewGroup.LayoutParams.WRAP_CONTENT,
                        ViewGroup.LayoutParams.WRAP_CONTENT, 0));
        setContentView(ll);
    }
    @Override
    public void onStop() {
        super.onStop();
        if (recorder != null) {
            recorder.release();
            recorder = null;
        }
        if (player != null) {
            player.release();
            player = null;
        }
    }
}

기본적으로 자동 생성 된 XML 코드입니다. Java 코드가 작성되는 방식으로 인해 변경 사항이 앱에서 활성화되지 않았으며 이것이 문제입니다.

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"/>

이것은 매니페스트 파일에 추가 된 필수 권한입니다 :

<uses-permission android:name="android.permission.RECORD_AUDIO" />

기본적으로 "LinearLayout"을 모든 코드 기능을 유지하면서 XML 사용을 제한하지 않는 것으로 대체하고 싶습니다

  • 답변 # 1

    방향을 LinearLayout으로 설정해야합니다. 아래 코드를 사용해보십시오. 또한 레이아웃이 매우 역동적이지 않을 때까지 XML을 사용하여 레이아웃을 디자인해야합니다.

    layout.setOrientation(LinearLayout.VERTICAL);
    
    

  • 답변 # 2

    LinearLayout 에서 방향 설정   Vertical  또는 Horizontal .

    linearLayout.setOrientation(LinearLayout.VERTICAL);
    
    

  • 답변 # 3

    XML에서 LinearLayout 대신 RelativeLayoute를 사용하십시오.

  • 답변 # 4

    런타임에 XML 코드를 바꾸려면 아래 행이 있습니다.

    setContentView(ll)
    
    


    따라서 XML 파일 내용 만 설정해야합니다.

    setContentView(R.layout.your_xml_file_name);
    
    

    자바 파일로 작성하는 버튼. 이 작업을 수행 할 필요는 없습니다. xml 파일에 버튼을 추가하고 위와 같은 xml 파일 내용을 설정하고 OnClickListener 를 구현하십시오.  자바 파일과 setOnClickListener  그 버튼에 또한 onClick 에서 해당 버튼에 각각의 기능을 추가  이벤트.

  • 이전 django : 장고 템플릿 DoesNotExist?
  • 다음 Ruby에서 HTML 페이지를 렌더링하는 방법이 있습니까?