2016-05-11 3 views
1

очень новый для разработки!Как связать кнопку в xml с действиями Java в классе

Я в основном хочу связать кнопку, которую я создал в XML, в java-код в соответствующем классе.

То, что я пытаюсь достичь, - это кнопка, расположенная над моим веб-просмотром с текстом «Начать запись» после того, как щелкнула функция записи звука, и затем текст изменится на «Остановить запись».

Проблема, с которой у меня возникает, заключается в том, что у меня есть кнопка на экране в моем приложении, однако на ней нет текста, и когда я нажимаю кнопку, мое приложение падает.

Ниже приведен код класса:

public class Drugs extends AppCompatActivity { 

WebView myBrowser; 

private static final String LOG_TAG = "Recording"; 
private static String mFileName = null; 


private RecordButton mRecordButton = null; 
private MediaRecorder mRecorder = null; 

private void onRecord(boolean start) { 
    if (start) { 
     startRecording(); 
    } else { 
     stopRecording(); 
    } 
} 

private void startRecording() { 
    mRecorder = new MediaRecorder(); 
    mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
    mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
    mRecorder.setOutputFile(mFileName); 
    mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 

    try { 
     mRecorder.prepare(); 
    } catch (IOException e) { 
     Log.e(LOG_TAG, "prepare() failed"); 
    } 

    mRecorder.start(); 
} 

private void stopRecording() { 
    mRecorder.stop(); 
    mRecorder.release(); 
    mRecorder = 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); 
    } 
} 

public Drugs() { 
    mFileName = Environment.getExternalStorageDirectory().getAbsolutePath(); 
    mFileName += "/audiorecordtest.3gp"; 
} 





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

    myBrowser = (WebView) findViewById(R.id.mybrowser); 
    myBrowser.loadUrl("file:///android_asset/drugs.html"); 
    myBrowser.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); 

    Button btndrugslaw = (Button) findViewById(R.id.drugslaw); 

    btndrugslaw.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) { 
      Intent intentdruglaw = new Intent(Drugs.this, DrugLaw.class); 
      startActivity(intentdruglaw); 
     } 
    }); 

} 

Это код XML

<ScrollView 
android:layout_height="match_parent" 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent"> 

<RelativeLayout 

xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context="kyr.com.knowyourrights.Drugs" 
android:orientation="vertical" 
> 

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/RecordButton" 
    android:layout_alignParentTop="true" 
    android:layout_centerHorizontal="true" 
    android:onClick="onClick" 
    > 

</Button> 

<WebView 
    android:id="@+id/mybrowser" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 

</WebView> 

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/drugslaw" 
    android:text="Take me to the law" 
    android:layout_below="@id/mybrowser" 
    android:layout_alignParentBottom="true" 
    android:layout_centerHorizontal="true" /> 

</RelativeLayout> 


</ScrollView> 

ответ

1

Есть много способов.

Например

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/RecordButton" 
    android:layout_above="@+id/mybrowser" 
    android:layout_alignParentTop="true" 
    android:onClick="recordClick" 
    android:layout_centerHorizontal="true"> 

, а затем в классе

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

    myBrowser = (WebView) findViewById(R.id.mybrowser); 
    myBrowser.loadUrl("file:///android_asset/drugs.html"); 
    myBrowser.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); 

    Button btndrugslaw = (Button) findViewById(R.id.drugslaw); 

    btndrugslaw.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) { 
      Intent intentdruglaw = new Intent(Drugs.this, DrugLaw.class); 
      startActivity(intentdruglaw); 
     } 
    }); 

public void recordClick(View view){ 

    // your code to handle click 
} 

} 

и если у вас есть несколько кнопок

public void recordClick(View view){ 

    switch(view.getId()) 

    //HERE YOU WILL PASS THE ID OF YOUR BUTTONS 
    case R.id.firstButton: 
     //Code to handle click 
    case R.id.secondButton: 
     //Code to handle second button click 

    // AND SO ON 
} 
+0

У меня есть только две кнопки, одна кнопка в нижней части WebView, который берет меня к новой деятельности - которая кодируется и работает отлично (R.id.drugslaw), и есть одна кнопка, которая обрабатывает функцию записи. Я считаю, что у меня есть код для записи (если только я этого не делаю), но когда я вхожу на соответствующий экран в своем приложении, нет кнопки, которая появляется для функции записи. @Anders – Viverson

+0

, так что вы говорите, что кнопка не видна? – Max

+0

Да, я не могу видеть кнопку – Viverson

0

Добавить метод OnClick в XML

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/RecordButton" 
    android:layout_above="@+id/mybrowser" 
    android:layout_alignParentTop="true" 
    android:layout_centerHorizontal="true" 
    android:onClick="RecordButton" 
    android:text="Start" 
    > 

В Java

Button btn = (Button) findViewById(R.id.RecordButton); 

    btn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
     RecordButton(v); 
     } 
    }); 


    public void RecordButton(View v) { 
      Button b = (Button)v; 
      if(b.getText().toString().equals("Start")){ 
      onRecord(true); 
      b.setText("Stop"); 
      }else{ 
      onRecord(false); 
      b.setText("Start"); 
    } 
0
<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/RecordButton" 
    android:layout_above="@+id/mybrowser" 
    android:layout_alignParentTop="true" 
    android:onClick="recordClick" 
    android:layout_centerHorizontal="true"> 

Реализует View.OnClickLIstener

public class Drugs extends AppCompatActivity implements View.OnClickListener { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_drugs); 
    Button btndrugs = (Button) findViewById(R.id.RecordButton); 
    btndurgs.setOnClickListener(this); 
     } 
    public void onClick(View v) { 
     switch (v.getId()){ 
      case(R.id.RecordButton): 
your logic here 
    break; 
    } 
}} 
+0

Когда я это делаю, мой onRecord boolean не может быть разрешен. Я пытаюсь получить одну кнопку, на которой есть тест «Начать запись», который при нажатии на запись звучит, тогда текст на той же кнопке будет меняться на «Стоп-запись», когда щелкнет она прекратит запись. – Viverson

+0

сделает вашу логическую переменную статической и изменит text your_button.setText (""); –

Смежные вопросы