Android Question Unable to load .txt file into multiline EditText — Requesting example Main.bas, manifest.xml, and required libraries

varayut

Member
Licensed User
Longtime User
To Erel, Martin, and Guru friends,

I’m trying to load a `.txt` file into a multiline `EditText` in B4A.
I’ve used `File.ReadString(...)` and assigned it to `EditText.Text`, but the content doesn’t appear or only partially loads.

Here’s what I’ve already tried:
- Used `Activity.LoadLayout(...)` before assigning the text
- Tested with files in both `File.DirInternal` and `File.DirAssets`
- Verified UTF-8 encoding
- Requested all permissions: `READ_EXTERNAL_STORAGE`, `MANAGE_EXTERNAL_STORAGE`, SAF
- Tried `WebViewExtras 2.20` (Martin’s library)
- Used `Phone.SdkVersion` to request `READ_MEDIA_IMAGES`, `READ_MEDIA_AUDIO`, `READ_MEDIA_VIDEO` for Android 13+
- Tried displaying with `Label.Text` — works, but `EditText` does not
- Tried `WebView` — limited scroll/zoom

Could you please provide:
1. A working example of `Main.bas` that loads a `.txt` file into a multiline `EditText`
2. The correct `manifest.xml` entries for Android 11 and above
3. A list of required libraries
4. Any better approach to display long text from a file (e.g., WebView, CustomListView)

Thanks,
varayut
 

varayut

Member
Licensed User
Longtime User
Sub Process_Globals
Private rp As RuntimePermissions
End Sub

Sub Globals
Private WebView1 As WebView
Private wvExtras As WebViewExtras
End Sub

Sub Activity_Create(FirstTime As Boolean)
Activity.LoadLayout("Main") ' Layout must contain WebView1

If Phone.SdkVersion >= 33 Then
rp.CheckAndRequest("android.permission.READ_MEDIA_IMAGES")
Else If Phone.SdkVersion >= 30 Then
rp.CheckAndRequest("android.permission.MANAGE_EXTERNAL_STORAGE")
Else
rp.CheckAndRequest("android.permission.READ_EXTERNAL_STORAGE")
End If

WebView1.LoadUrl("file://" & File.Combine(File.DirAssets, "viewer.html"))
wvExtras.Initialize(WebView1)

' Optional: Load text from internal file and inject
If File.Exists(File.DirInternal, "myfile.txt") Then
Dim txt As String = File.ReadString(File.DirInternal, "myfile.txt")
InjectText(txt)
End If
End Sub

Sub InjectText(txt As String)
Dim safeText As String = EscapeForJs(txt)
wvExtras.executeJavascript("window.setContent(" & safeText & ");")
End Sub

Sub EscapeForJs(s As String) As String
Return $"'${s.Replace("\", "\\").Replace("'", "\\'").Replace(CRLF, "\n")}'"$
End Sub
 
Upvote 0

varayut

Member
Licensed User
Longtime User
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.varayut.shrineapp">

<!-- Android ≤ 10 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<!-- Android 11–12 -->
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>

<!-- Android 13+ -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO"/>
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO"/>

<application
android:requestLegacyExternalStorage="true"
android:allowBackup="true"
android:label="ShrineApp"
android:theme="@android:style/Theme.Material.Light.DarkActionBar">
</application>
</manifest>
 
Upvote 0

varayut

Member
Licensed User
Longtime User
Code as here IMG_4843.jpeg
 
Upvote 0
Top