Android 使textview的某些部分可单击(而不是url)

Android 使textview的某些部分可单击(而不是url),android,android-layout,Android,Android Layout,我已经挣扎了一段时间了。在需要的活动中,点击“注册”,表示我同意服务条款和隐私政策。 “服务条款”和“隐私政策”部分需要可点击。我找到的解决方案,使url的。但是我不需要url来浏览术语,也不需要启动术语活动或隐私活动 然后我发现: 但这里的问题是,它们没有对齐。我的意思是:如果有一部分辨率很小的手机,我需要在textview2旁边设置textview1,在textview1下面设置textview3,旁边设置textview4。但是,当我在平板电脑或大屏幕手机上使用该应用程序时,可能所有的文本

我已经挣扎了一段时间了。在需要的活动中,点击“注册”,表示我同意服务条款和隐私政策。 “服务条款”和“隐私政策”部分需要可点击。我找到的解决方案,使url的。但是我不需要url来浏览术语,也不需要启动术语活动或隐私活动

然后我发现: 但这里的问题是,它们没有对齐。我的意思是:如果有一部分辨率很小的手机,我需要在textview2旁边设置textview1,在textview1下面设置textview3,旁边设置textview4。但是,当我在平板电脑或大屏幕手机上使用该应用程序时,可能所有的文本视图都可以并排放置,但布局与小屏幕手机上的相同=

文本视图1-文本视图2 文本视图3-文本视图4

一个可能的解决方案是flowlayout,但我遇到了一些错误,似乎找不到一个好的教程(针对初学者)

任何想法都很感激

Thx


Bjorn

好的,所以您需要使文本视图可以单击,这很简单。 创建文本视图的对象并调用活动

      termnservc =(TextView)findViewById(R.id.srvid);
      termnservc.setOnClickListener(this);
       // use on click method
                    @Override
                public void onClick(View v) {                                         
            switch (v.getId()) {
            case R.id.srvid:
        Intent termsandcondition=new Intent(this, TermsOfService.class);
        startActivity(termsandcondition);
        break;
                    }
}

编辑

有关ClickableSpan的更多信息

您还可以通过将可展字符串设为粗体、斜体或设置字体大小来设置其样式

    StyleSpan boldSpan = new StyleSpan( Typeface.ITALIC );
    ss.setSpan( boldSpan, 22, 27, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE );
    StyleSpan boldSpan1 = new StyleSpan(Typeface.BOLD);
    ss.setSpan(new RelativeSizeSpan(3f), 0, 7, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);//set fontsize
    ss.setSpan( boldSpan1, 0, 7, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE );

如果需要使用带有HTML消息的Raghunandan Answer,请执行以下操作 在显示功能中

public void displayText(String message) {

            chapterTextView.setText(Html.fromHtml(message),TextView.BufferType.SPANNABLE);
            chapterTextView.setMovementMethod(LinkMovementMethod.getInstance());
            Spannable clickableMessage = (Spannable) chapterTextView.getText();
            chapterTextView.setText(addClickablePart(clickableMessage), BufferType.SPANNABLE);
}
addClickablePart的修改功能

private SpannableStringBuilder  addClickablePart(Spannable charSequence) {
        SpannableStringBuilder  ssb = new SpannableStringBuilder(charSequence);

        int idx1 = charSequence.toString().indexOf("(");
        int idx2 = 0;
        while (idx1 != -1) {
            idx2 = charSequence.toString().indexOf(")", idx1) + 1;

            final String clickString = charSequence.toString().substring(idx1, idx2);
            ssb.setSpan(new ClickableSpan() {

                @Override
                public void onClick(View widget) {
                    Toast.makeText(getActivity(), clickString,
                            Toast.LENGTH_SHORT).show();
                }
            }, idx1, idx2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            idx1 = charSequence.toString().indexOf("(", idx2);
        }

        return ssb;
    }

希望这对其他人有所帮助。

在xml布局中,只需添加
clickable=“true”
,然后像使用按钮一样使用
onClick
事件。您说您不想使用url,您的意思是您想要url的视觉效果,而是要打开活动。或者你的意思是你不想让它看起来像url?我不想让它看起来像url的,但是启动一个活动,我不想启动一个浏览器试试这很好,但是括号对用户来说是可见的。有解决方法吗?如果您不想用默认颜色(我的是绿色)突出显示单击的部分,请尝试
\u tv.setHighlightColor(getResources().getColor(android.R.color.transparent))
ClickableSpan cs = new ClickableSpan() {  
     @Override 
     public void onClick(View view) {  
        //action stuff here
     }  
};

String text_terms_string = getResources().getString(R.string.register_terms_text);
SpannableString ss = new SpannableString(text_terms_string);

int termStart = text_terms_string.indexOf("Terms");
int termStop = termStart + "term".length();

//we set here clickable our text  
ss.setSpan(cs, termStart, termStop, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

//we set here our color i.e. #cccccc in this example I take color from xml  
ss.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.aquaBlue)),termStart,termStop,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

//we set here text to be bolded    
ss.setSpan(new StyleSpan(Typeface.BOLD),termStart,termStop,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

//I set here spannable text to my previous declared TextView  
text_terms_link.setText(ss);

//We set here clickable text, this is important !!  
text_terms_link.setMovementMethod(LinkMovementMethod.getInstance());
private SpannableStringBuilder  addClickablePart(Spannable charSequence) {
        SpannableStringBuilder  ssb = new SpannableStringBuilder(charSequence);

        int idx1 = charSequence.toString().indexOf("(");
        int idx2 = 0;
        while (idx1 != -1) {
            idx2 = charSequence.toString().indexOf(")", idx1) + 1;

            final String clickString = charSequence.toString().substring(idx1, idx2);
            ssb.setSpan(new ClickableSpan() {

                @Override
                public void onClick(View widget) {
                    Toast.makeText(getActivity(), clickString,
                            Toast.LENGTH_SHORT).show();
                }
            }, idx1, idx2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            idx1 = charSequence.toString().indexOf("(", idx2);
        }

        return ssb;
    }
ClickableSpan cs = new ClickableSpan() {  
     @Override 
     public void onClick(View view) {  
        //action stuff here
     }  
};

String text_terms_string = getResources().getString(R.string.register_terms_text);
SpannableString ss = new SpannableString(text_terms_string);

int termStart = text_terms_string.indexOf("Terms");
int termStop = termStart + "term".length();

//we set here clickable our text  
ss.setSpan(cs, termStart, termStop, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

//we set here our color i.e. #cccccc in this example I take color from xml  
ss.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.aquaBlue)),termStart,termStop,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

//we set here text to be bolded    
ss.setSpan(new StyleSpan(Typeface.BOLD),termStart,termStop,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

//I set here spannable text to my previous declared TextView  
text_terms_link.setText(ss);

//We set here clickable text, this is important !!  
text_terms_link.setMovementMethod(LinkMovementMethod.getInstance());