0

I'm trying to develop an Android application with Java. I need to separate all words in a text (bookText in code) and make them clickable. How can I do this? I will be grateful if you could help me. Thanks in advance.

public class BookActivity extends AppCompatActivity {

public static final String BOOK_TEXT = "com.example.altaybook.BOOK_TEXT";
BookViewModel bookViewModel;
private TextView bookTextView;
private String bookName;
private String bookText;
ProgressBar bookTextProgressBar;

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

    bookTextView = findViewById(R.id.book_text_id);
    bookTextProgressBar = findViewById(R.id.bookTextProgressBar);
    Intent intent = getIntent();
    final int bookPosition = intent.getIntExtra(BOOK_TEXT, -1);

    bookViewModel = new ViewModelProvider(this, ViewModelProvider.AndroidViewModelFactory.getInstance(this.getApplication())).get(BookViewModel.class);
    bookViewModel.getAllBooks().observe(this, new Observer<List<Book>>() {
        @Override
        public void onChanged(List<Book> books) {
            bookName = books.get(bookPosition).getName();
            setTitle(bookName);
            bookText = books.get(bookPosition).getText();
            SetTextAsyncTask setTextAsyncTask = new SetTextAsyncTask();
            setTextAsyncTask.execute();
            bookTextView.setMovementMethod(LinkMovementMethod.getInstance());

        }
    });
}

public class SetTextAsyncTask extends AsyncTask<String, Void, Void> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        bookTextProgressBar.setVisibility(View.VISIBLE);
    }

    @Override
    protected Void doInBackground(String... strings) {
        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        bookTextView.setText(bookText);
        bookTextProgressBar.setVisibility(View.GONE);
    }
}

}

Hasan Cihad Altay
  • 171
  • 1
  • 4
  • 11
  • 5
    Does this answer your question? [Create clickable link in text view in android](https://stackoverflow.com/questions/19908547/create-clickable-link-in-text-view-in-android) – Uuu Uuu Feb 04 '21 at 01:25
  • 1
    Could you clarify the desired result? What do you mean by "separate all words in a text"? Do you mean they need to be separately clickable? – Ryan M Feb 05 '21 at 10:50

1 Answers1

0

You can use LinearLayout. Here is an example:

  • activity_book.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"
    android:gravity="center">

    <LinearLayout
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:orientation="horizontal"
        android:gravity="center"
        android:id="@+id/container"/>

</LinearLayout>
  • BookActivity.java
public class BookActivity extends Activity
{
    public static final String BOOK_TEXT = "com.example.altaybook.BOOK_TEXT";
    
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_book);
        
        LinearLayout ll = findViewById(R.id.container);
        String[] splitText = BOOK_TEXT.split("\\.");
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        
        for(int i=0; i < splitText.length; i++) {
            TextView content = new TextView(this);
            if(i == 0) { content.setText(splitText[i]);
            } else { content.setText("." + splitText[i]); }
            content.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Toast.makeText(BookActivity.this, "You clicked: " + ((TextView)view).getText(), Toast.LENGTH_SHORT).show();
                }
            });
            ll.addView(content, params);
        } 
    }
}
Darkman
  • 2,941
  • 2
  • 9
  • 14