Lab PRograms1
Lab PRograms1
activity_main.xml
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello M S Ramaiah"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
Output:
2. Design an Android application to demonstrate the use of LinearLayout,
RelativeLayout, and ConstraintLayout.
Solution:Project Structure:
1.MainActivity.java – LinearLayout
2. RelativeActivity.java – RelativeLayout
3. ConstraintActivity.java – ConstraintLayout
Each activity will show a basic layout example and a button to move to the next layout.
1. MainActivity.java – LinearLayout
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="119dp"
android:orientation="horizontal">
<Button
android:id="@+id/btnFirst"
android:layout_width="0dp"
android:layout_height="94dp"
android:layout_weight="1"
android:onClick="loadFirstFragment"
android:text="First Fragment"
/>
<Button
android:id="@+id/btnSecond"
android:layout_width="0dp"
android:layout_height="88dp"
android:layout_weight="1"
android:onClick="loadSecondFragment"
android:text="Second Fragment" />
</LinearLayout>
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
MainActivity.java
package com.example.prog2;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
@Override
public void onClick(View v) {
this.v = v;
Intent intent = new Intent(MainActivity.this, RelativeActivity.class);
startActivity(intent);
}
});
}
}
2. RelativeActivity.java – RelativeLayout
✅ activity_relative.xml
<TextView
android:id="@+id/relative_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="This is RelativeLayout"
android:textSize="20sp" />
<Button
android:id="@+id/button_relative"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/relative_text"
android:layout_marginTop="20dp"
android:text="Go to ConstraintLayout" />
</RelativeLayout>
✅ RelativeActivity.java
package com.example.prog2;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
3. ConstraintActivity.java – ConstraintLayout
✅ activity_constraint.xml
<TextView
android:id="@+id/constraint_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="This is ConstraintLayout"
android:textSize="20sp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:layout_marginTop="100dp"/>
<Button
android:id="@+id/button_constraint"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Back to LinearLayout"
app:layout_constraintTop_toBottomOf="@id/constraint_text"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:layout_marginTop="20dp"/>
</androidx.constraintlayout.widget.ConstraintLayout>
✅ RelativeActivity.java
package com.example.prog2;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Prog2"
tools:targetApi="31">
<activity android:name=".ConstraintActivity"/>
<activity android:name=".RelativeActivity"/>
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
</manifest>
Output:
3. Develop an app to implement UI components like Buttons,
TextViews, Checkboxes, and Radio Buttons.
Solution:
MainActivity.Java
package com.example.prog4;
import android.os.Bundle;
import android.view.View;
import android.widget.*;
import androidx.appcompat.app.AppCompatActivity;
EditText etName;
Button btnShow;
TextView tvOutput;
Switch switchLight;
CheckBox cbMusic, cbReading;
RadioGroup rgGender;
RadioButton rbMale, rbFemale;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Initialize UI components
etName = findViewById(R.id.etName);
btnShow = findViewById(R.id.btnShow);
tvOutput = findViewById(R.id.tvOutput);
switchLight = findViewById(R.id.switchLight);
cbMusic = findViewById(R.id.cbMusic);
cbReading = findViewById(R.id.cbReading);
rgGender = findViewById(R.id.rgGender);
rbMale = findViewById(R.id.rbMale);
rbFemale = findViewById(R.id.rbFemale);
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:padding="16dp"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/etName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Enter your name" />
<Button
android:id="@+id/btnShow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Show Name" />
<TextView
android:id="@+id/tvOutput"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Output will appear here"
android:textSize="16sp"
android:paddingTop="8dp" />
<Switch
android:id="@+id/switchLight"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Light Switch" />
<CheckBox
android:id="@+id/cbMusic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Music" />
<CheckBox
android:id="@+id/cbReading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Reading" />
<RadioGroup
android:id="@+id/rgGender"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<RadioButton
android:id="@+id/rbMale"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Male" />
<RadioButton
android:id="@+id/rbFemale"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Female" />
</RadioGroup>
</LinearLayout>
Output:
4.Implement event handling for various UI components such as clicks and
toggle switches.
Solution:
AndroidManifest.xml
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Pro3"
tools:targetApi="31">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category
android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
mainActivity.java
package com.example.pro3;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import android.view.View;
import android.widget.*;
TextView tvResult;
RadioGroup rgGender;
RadioButton rbMale, rbFemale;
CheckBox cbJava, cbPython, cbAndroid;
Button btnSubmit;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvResult = findViewById(R.id.tvResult);
rgGender = findViewById(R.id.rgGender);
rbMale = findViewById(R.id.rbMale);
rbFemale = findViewById(R.id.rbFemale);
cbJava = findViewById(R.id.cbJava);
cbPython = findViewById(R.id.cbPython);
cbAndroid = findViewById(R.id.cbAndroid);
btnSubmit = findViewById(R.id.btnSubmit);
btnSubmit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Gender
int selectedId = rgGender.getCheckedRadioButtonId();
if (selectedId != -1) {
RadioButton selectedRadio = findViewById(selectedId);
result.append("Gender:
").append(selectedRadio.getText()).append("\n");
}
// Skills
result.append("Skills: ");
if (cbJava.isChecked()) result.append("Java ");
if (cbPython.isChecked()) result.append("Python ");
if (cbAndroid.isChecked()) result.append("Android ");
tvResult.setText(result.toString());
}
});
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<RadioButton
android:id="@+id/rbMale"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Male"/>
<RadioButton
android:id="@+id/rbFemale"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Female"/>
</RadioGroup>
<CheckBox
android:id="@+id/cbPython"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Python"/>
<CheckBox
android:id="@+id/cbAndroid"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Android"/>
/* Explicit Intent: This involves navigating from one activity to another within the same
application. Implicit Intent: This involves triggering an action that can be handled by another
application. */
NOTE:.Goto device manager->select the emulator and wipe out data) and set DNS server IP as
8.8.8.8
Mainactivity.java
package com.example.program4;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_main);
}
public void onImplicitButtonClicked(View view)
{
Uri url=Uri.parse("https://www.google.com");
Intent i=new Intent(Intent.ACTION_VIEW, url);
startActivity(i);
}
public void onExplicitButtonClicked(View view )
{
Intent i=new Intent(MainActivity.this, SecondActivity.class);
startActivity(i);
}
}
SecondActivity.java
package com.example.program4;
import android.os.Bundle;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
public class SecondActivity extends AppCompatActivity {
Button btnImplicitContent;
@Override
}
}
Activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
tools:context=".MainActivity">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/implicit_intent"
android:onClick="onImplicitButtonClicked"
style="?android:attr/buttonBarButtonStyle" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/explicit_intent"
android:onClick="onExplicitButtonClicked"
style="?android:attr/buttonBarButtonStyle" />
</LinearLayout>
Activity_second.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".SecondActivity">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/welcome_to_explicit_intent"
android:textSize="28sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
Manifest file
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.PRogram4"
tools:targetApi="31">
<activity
android:name=".SecondActivity"
android:exported="false">
</activity>
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Output:
On click of implicit intent button appears below screen
On click of Explicit intent button appears below screen
6. Create a sample application with login module (check user name and
password) on successful login change Textview “Login Successful”. On login
fail alert using Toast “login fail”
<EditText
android:id="@+id/etUsername"
android:hint="Username"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<EditText
android:id="@+id/etPassword"
android:hint="Password"
android:inputType="textPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp" />
<Button
android:id="@+id/btnLogin"
android:text="Login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp" />
<TextView
android:id="@+id/tvStatus"
android:text=""
android:textSize="18sp"
android:textColor="#008000"
android:layout_marginTop="30dp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etUsername = findViewById(R.id.etUsername);
etPassword = findViewById(R.id.etPassword);
btnLogin = findViewById(R.id.btnLogin);
tvStatus = findViewById(R.id.tvStatus);
btnLogin.setOnClickListener(v -> {
String username = etUsername.getText().toString();
String password = etPassword.getText().toString();
Output:
7.Build an application to send an SMS or make a phone call using Native
Actions with Intents.
Solution:
Mainactivity.java
package com.example.sms;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.telephony.SmsManager;
import android.telephony.SmsMessage;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import android.Manifest;
if (!checkSMSPermission()) {
requestSMSPermission();
}
// Register SMS receiver
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
registerReceiver(smsReceiver, intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(smsReceiver);
}
// Button click listener for sending SMS
public void sendMessage(View view) {
String phoneNumber =
editTextPhoneNumber.getText().toString().trim();
String message = editTextMessage.getText().toString();
if (phoneNumber.isEmpty()) {
Toast.makeText(this, "Please enter a valid phone number",
Toast.LENGTH_SHORT).show();
return;
}
try {
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(phoneNumber, null, message, null, null);
Toast.makeText(this, "Message sent", Toast.LENGTH_SHORT).show();
} catch (IllegalArgumentException e) {
Toast.makeText(this, "Invalid phone number format",
Toast.LENGTH_SHORT).show();
} catch (Exception e) {
Toast.makeText(this, "Failed to send message",
Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
}
// Check if SMS permission is granted
Activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<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"
android:background="@color/white"
tools:context=".MainActivity">
<EditText
android:id="@+id/editTextPhoneNumber"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:layout_marginBottom="16dp"
android:autofillHints="Enter phone number"
android:hint="Enter phone number"
android:inputType="phone" />
<EditText
android:id="@+id/editTextMessage"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/editTextPhoneNumber"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:layout_marginBottom="16dp"
android:autofillHints="Enter Message"
android:hint="Enter Message" />
<Button
android:id="@+id/buttonSend"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Send"
android:layout_below="@id/editTextMessage"
android:layout_alignParentEnd="true"
android:layout_marginEnd="16dp"
android:onClick="sendMessage"
tools:ignore="HardcodedText,UsingOnClickInXml" />
<TextView
android:id="@+id/textViewReceivedMessages"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/buttonSend"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:layout_marginBottom="16dp"
android:textColor="@color/black" />
</RelativeLayout>
AndroidManifest.xml File
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-feature
android:name="android.hardware.telephony"
android:required="false" />
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.READ_SMS"/>
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.SMS"
tools:targetApi="31">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
</manifest>
Output:
1.Goto Emulator Contact -> Store some contacts
2. Send sms to those contacts
3. Goto message in emulator and check sms
Program 14
Project Structure
MainActivity.java
SenderFragment.java (Fragment A)
ReceiverFragment.java (Fragment B)
XML Layouts for each
Concept Use
Fragments Modular screens inside activity
Interface Callback To communicate Fragment → Activity
Activity Logic Transfers data between fragments
MainActivity.Java
package com.example.fra;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
ReceiverFragment receiverFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Add SenderFragment
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragmentContainerA, new SenderFragment())
.commit();
// Add ReceiverFragment
receiverFragment = new ReceiverFragment();
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragmentContainerB, receiverFragment)
.commit();
}
ReceiverFragment.java
package com.example.fra;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.*;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
TextView textView;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater,
@Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_receiver, container, false);
textView = view.findViewById(R.id.tvResult);
return view;
}
SenderFragment.Java
package com.example.fra;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.*;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
EditText editText;
Button button;
OnDataPass dataPasser;
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
dataPasser = (OnDataPass) context;
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater,
@Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
editText = view.findViewById(R.id.etInput);
button = view.findViewById(R.id.btnSend);
button.setOnClickListener(v -> {
String text = editText.getText().toString();
dataPasser.onDataPass(text);
});
return view;
}
}
activity_main.xml
<FrameLayout
android:id="@+id/fragmentContainerA"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"/>
<FrameLayout
android:id="@+id/fragmentContainerB"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"/>
</LinearLayout>
fragment_receiver.xml
<TextView
android:id="@+id/tvResult"
android:text="Waiting for data..."
android:layout_gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="18sp"/>
</FrameLayout>
fragment_sender.xml
<EditText
android:id="@+id/etInput"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Enter something" />
<Button
android:id="@+id/btnSend"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Send to Fragment B" />
</LinearLayout>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.audiorecorder">
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission
android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<application
android:allowBackup="true"
android:label="Audio Recorder"
android:supportsRtl="true"
android:theme="@style/Theme.AppCompat.Light.DarkActionBar">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
activity_main.xml
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
android:padding="20dp">
<Button
android:id="@+id/btnRecord"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Record"/>
<Button
android:id="@+id/btnStop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Stop"/>
<Button
android:id="@+id/btnPlay"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Play"/>
</LinearLayout>
MainActivity.java
package com.example.audiorecorder;
import android.Manifest;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import java.io.IOException;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Request permissions
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.RECORD_AUDIO,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE},
1);
btnRecord = findViewById(R.id.btnRecord);
btnStop = findViewById(R.id.btnStop);
btnPlay = findViewById(R.id.btnPlay);
audioFilePath =
getExternalFilesDir(Environment.DIRECTORY_MUSIC).getA
bsolutePath() + "/recording.3gp";
btnRecord.setOnClickListener(v -> {
startRecording();
});
btnStop.setOnClickListener(v -> {
stopRecordingOrPlayback();
});
btnPlay.setOnClickListener(v -> {
startPlaying();
});
}
try {
mediaRecorder.prepare();
mediaRecorder.start();
Toast.makeText(this, "Recording started...",
Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
}
}
Solution:
🧱 Project Structure
app/
├── java/
│ └── com.example.fragmentdemo/
│ ├── MainActivity.java
│ ├── FirstFragment.java
│ └── SecondFragment.java
├── res/
│ └── layout/
│ ├── activity_main.xml
│ ├── fragment_first.xml
│ └── fragment_second.xml
1. MainActivity.java
package com.example.fragmentdemo;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import android.view.View;
import android.widget.Button;
// Called by android:onClick="loadFirstFragment"
public void loadFirstFragment(View view) {
loadFragment(new FirstFragment());
}
// Called by android:onClick="loadSecondFragment"
public void loadSecondFragment(View view) {
loadFragment(new SecondFragment());
}
FirstFragment.java
package com.example.fragmentdemo;
import android.os.Bundle;
import android.util.Log;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public FirstFragment() {}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("FragmentLifecycle", "FirstFragment - onCreate");
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Log.d("FragmentLifecycle", "FirstFragment - onCreateView");
return inflater.inflate(R.layout.fragment_first, container, false);
}
@Override
public void onStart() {
super.onStart();
Log.d("FragmentLifecycle", "FirstFragment - onStart");
}
@Override
public void onResume() {
super.onResume();
Log.d("FragmentLifecycle", "FirstFragment - onResume");
}
@Override
public void onPause() {
super.onPause();
Log.d("FragmentLifecycle", "FirstFragment - onPause");
}
@Override
public void onStop() {
super.onStop();
Log.d("FragmentLifecycle", "FirstFragment - onStop");
}
@Override
public void onDestroyView() {
super.onDestroyView();
Log.d("FragmentLifecycle", "FirstFragment - onDestroyView");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d("FragmentLifecycle", "FirstFragment - onDestroy");
}
}
SecondFragment.java
package com.example.fragmentdemo;
import android.os.Bundle;
import android.util.Log;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public SecondFragment() {}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Log.d("FragmentLifecycle", "SecondFragment - onCreateView");
return inflater.inflate(R.layout.fragment_second, container, false);
}
}
activity_main.xml
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="119dp"
android:orientation="horizontal">
<Button
android:id="@+id/btnFirst"
android:layout_width="0dp"
android:layout_height="94dp"
android:layout_weight="1"
android:onClick="loadFirstFragment"
android:text="First Fragment"
/>
<Button
android:id="@+id/btnSecond"
android:layout_width="0dp"
android:layout_height="88dp"
android:layout_weight="1"
android:onClick="loadSecondFragment"
android:text="Second Fragment" />
</LinearLayout>
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
fragment_first.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:background="#C8E6C9"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:text="This is First Fragment"
android:textSize="20sp"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</FrameLayout>
fragment_second.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:background="#FFCDD2"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:text="This is Second Fragment"
android:textSize="20sp"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</FrameLayout>
📲 Output
Fragment Lifecycle :
Method Description
onAttach() Fragment is attached to activity
onCreate() Initialize fragment
onCreateView() Create UI for fragment
onStart() Fragment becomes visible
onResume() Fragment is interacting with user
onPause() Fragment is partially hidden
onStop() Fragment no longer visible
onDestroyView() Remove UI elements
onDestroy() Final cleanup
onDetach() Fragment is detached from activity
13. Build an application to save and retrieve data from internal
and external storage.
Solution:
Prerequisites:
Android Studio
Permissions for external storage (handled for Android 10+ using MediaStore or SAF)
File Structure:
MainActivity.java
activity_main.xml
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.storageapp">
<uses-permission
android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="28"/> <!-- Needed only up to Android 9 -->
<application
android:allowBackup="true"
android:label="StorageApp"
android:supportsRtl="true"
android:theme="@style/Theme.StorageApp">
<activity android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
res/values/themes.xml:
<resources xmlns:tools="http://schemas.android.com/tools">
<style name="Theme.StorageApp" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme
<item name="colorPrimary">@color/purple_500</item>
<item name="colorPrimaryDark">@color/purple_700</item>
<item name="colorAccent">@color/teal_200</item>here -->
</style>
</resources>
Activity_main.xml
<Button
android:id="@+id/btnSaveInternal"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginTop="64dp"
android:text="Save to Internal"
app:layout_constraintTop_toBottomOf="@+id/editTextData"
tools:layout_editor_absoluteX="0dp" />
<Button
android:id="@+id/btnLoadInternal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="28dp"
android:layout_marginEnd="16dp"
android:text="Load from Internal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/btnSaveInternal" />
<Button
android:id="@+id/btnSaveExternal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:text="Save to External"
app:layout_constraintTop_toBottomOf="@+id/btnLoadInternal"
tools:layout_editor_absoluteX="0dp" />
<Button
android:id="@+id/btnLoadExternal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="48dp"
android:layout_marginEnd="16dp"
android:text="Load from External"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/btnSaveExternal" />
<TextView
android:id="@+id/textViewOutput"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:paddingTop="16dp"
android:text="Output will be shown here"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/btnLoadExternal" />
</androidx.constraintlayout.widget.ConstraintLayout>
MainActivity.java
package com.example.storageapp;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Environment;
import android.widget.*;
import java.io.*;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editTextData = findViewById(R.id.editTextData);
textViewOutput = findViewById(R.id.textViewOutput);
findViewById(R.id.btnSaveInternal).setOnClickListener(view ->
saveToInternal());
findViewById(R.id.btnLoadInternal).setOnClickListener(view ->
loadFromInternal());
findViewById(R.id.btnSaveExternal).setOnClickListener(view ->
saveToExternal());
findViewById(R.id.btnLoadExternal).setOnClickListener(view ->
loadFromExternal());
}