首页 > 解决方案 > 如何使文本中的所有单词都可点击?

问题描述

我正在尝试使用 Java 开发 Android 应用程序。我需要分隔文本中的所有单词(代码中的 bookText)并使它们可点击。我怎样才能做到这一点?如果您能帮助我,我将不胜感激。提前致谢。

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);
    }
}

}

标签: javaandroid

解决方案


您可以使用LinearLayout. 这是一个例子:

  • 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);
        } 
    }
}

推荐阅读