gpt4 book ai didi

android - android 3 (API <=11) 组件中的新可选 TextView

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:40:53 24 4
gpt4 key购买 nike

经过漫长而耗时的搜索,我找不到可以在 textview 中为 android API 级别 <=11 选择文本的组件。我写了这个可能对你有帮助的组件:

public class SelectableTextView extends TextView {

public static int _SelectedBackgroundColor = 0xffA6D4E1;
public static int _SelectedTextColor = 0xff000000;
private OnTouchListener lastOnTouch;
protected int textOffsetStart;
protected int textOffsetEnd;
private OnLongClickListener lastOnLongClick;
protected boolean longCliked;
protected boolean isDowned;
protected int textSelectedEnd;
protected int textSelectedStart;
private static SelectableTextView lastInstance;

public SelectableTextView(Context context) {
super(context);
}

public void setTextIsSelectable(boolean selectable) {
// TODO:ANDROID3
// if:androidversion>=3
// super.setTextIsSelectable(selectable);
// else
super.setLongClickable(true);
super.setOnLongClickListener(getSelectableLongClick());
super.setOnTouchListener(getSelectableOnTouch());
}

private OnLongClickListener getSelectableLongClick() {
return new OnLongClickListener() {

@Override
public boolean onLongClick(View v) {
longCliked = true;
if (lastOnLongClick != null) {
lastOnLongClick.onLongClick(v);
}
return true;
}
};
}

@Override
public void setOnTouchListener(OnTouchListener l) {
super.setOnTouchListener(l);
this.lastOnTouch = l;
}

@Override
public void setOnLongClickListener(OnLongClickListener l) {
super.setOnLongClickListener(l);
this.lastOnLongClick = l;
}

private OnTouchListener getSelectableOnTouch() {
return new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();

if (action == MotionEvent.ACTION_DOWN) {
if (lastInstance == null)
lastInstance = SelectableTextView.this;
if (lastInstance != null && lastInstance != SelectableTextView.this) {
lastInstance.clean();
lastInstance = SelectableTextView.this;
}

int offset = getOffset(event);
if ((offset < textOffsetEnd && offset > textOffsetStart)
|| (offset > textOffsetEnd && offset < textOffsetStart)) {
if (textOffsetEnd - offset > offset - textOffsetStart)
textOffsetStart = textOffsetEnd;
} else {
clean();
textOffsetStart = offset;
}
isDowned = true;
} else if (isDowned && longCliked && action == MotionEvent.ACTION_MOVE) {
selectTextOnMove(event);
} else if (action == MotionEvent.ACTION_UP) {
isDowned = false;
longCliked = false;
}
if (lastOnTouch != null)
lastOnTouch.onTouch(v, event);
return false;
}

};
}

private void selectTextOnMove(MotionEvent event) {
int offset = getOffset(event);
if (offset != Integer.MIN_VALUE) {
String text = getText().toString();
SpannableStringBuilder sb = new SpannableStringBuilder(text);
BackgroundColorSpan bgc = new BackgroundColorSpan(_SelectedBackgroundColor);
ForegroundColorSpan textColor = new ForegroundColorSpan(_SelectedTextColor);

int start = textOffsetStart;
textOffsetEnd = offset;
int end = offset;
if (start > end) {
int temp = start;
start = end;
end = temp;
}
int[] curectStartEnd = curectStartEnd(text, start, end);
start = curectStartEnd[0];
end = curectStartEnd[1];
SelectableTextView.this.textSelectedStart = start;
SelectableTextView.this.textSelectedEnd = end;
sb.setSpan(bgc, start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
sb.setSpan(textColor, start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);

setText(sb);
}
}

private int[] curectStartEnd(String text, int start, int end) {
int length = text.length();

while (start < length && start > 0 && text.charAt(start) != ' ') {
start--;
}
while (end < length && text.charAt(end) != ' ') {
end++;
}
return new int[] { start, end };
}

private int getOffset(MotionEvent event) {
Layout layout = getLayout();
if (layout == null)
return Integer.MIN_VALUE;
float x = event.getX() + getScrollX();
float y = event.getY() + getScrollY();
int line = layout.getLineForVertical((int) y);
int offset = layout.getOffsetForHorizontal(line, x);
return offset;
}

protected void clean() {
if (this.getText() != null) {
this.setText(this.getText().toString());
textSelectedStart = 0;
textSelectedEnd = 0;
}
}

@Override
public int getSelectionStart() {
return textSelectedStart;
}

@Override
public int getSelectionEnd() {
return textSelectedEnd;
}

}

getOffset 获取 Touched 用户使用此组件设置这些属性时选定的文本偏移量:

        SelectableTextView textView1 = new SelectableTextView(context);
textView1.setClickable(false);
textView1.setCursorVisible(false);
textView1.setOnTouchListener(getOnTextTouch());//new after text select touch
textView1.setEnabled(this.selectable);
textView1.setTextIsSelectable(this.selectable);

任何人都可以升级这个组件吗?

This is the code in git hub

最佳答案

因为this还要加上下面两个构造函数

    public SelectableTextView(Context context,AttributeSet attrs)
{
super(context,attrs);
}

public SelectableTextView(Context context,AttributeSet attrs,int defStyle)
{
super(context,attrs,defStyle);
}

我还在代码中添加了以下内容:

    @SuppressLint("NewApi")
public void setTextIsSelectable(boolean selectable) {
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB)
super.setTextIsSelectable(true);
else
{
super.setLongClickable(true);
super.setOnLongClickListener(getSelectableLongClick());
super.setOnTouchListener(getSelectableOnTouch());
}
}

我是这样使用的,没有 OnTouchListener:

txt_copyFrom.setClickable(false);
txt_copyFrom.setCursorVisible(false);
txt_copyFrom.setEnabled(true);
txt_copyFrom.setTextIsSelectable(true);
txt_copyFrom.setOnLongClickListener(new OnLongClickListener(){

@Override
public boolean onLongClick(View v) {
int start=txt_copyFrom.getSelectionStart();
int end=txt_copyFrom.getSelectionEnd();

mSelectedText=txt_copyFrom.getText().toString().substring(start, end);
Log.d(TAG, "Selected text: "+mSelectedText);
return true;
}

});

使用 XML:

<com.example.clipboardtest.SelectableTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Old Buccaneer1The Old Sea-dog at the Admiral BenbowSquire Trelawney, Dr. Livesey, and the rest of these gentlemen having asked me to write down the whole particulars about Treasure Island, from the beginning to the end, keeping nothing back but the bearings of the island, and that only because there is still treasure not yet lifted, I take up my pen in the year of grace 17--and go back to the time when my father kept the Admiral Benbow inn and the brown old seaman with the sabre cut first took up his lodging under our roof."
android:id="@+id/txt_copyfrom"
/>

我想我必须在 OnLongClickListener 中为 Activity 本身的 TextView 设置一个 OnTouchListener

尝试将 Logs 放在 SelectableTextView 中的各个位置,它似乎不起作用...我发现调用了 LongClickListener 但甚至没有调用 TouchListener...

在 OnLongClickListener 中设置 OnTouchListener 做了 this

关于android - android 3 (API <=11) 组件中的新可选 TextView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18042308/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com