Text Paset

本文深入探讨了自定义TextView类TextPage的功能特性及其实现细节,包括复制功能、上下文菜单事件处理、软键盘显示控制等。通过实例代码展示如何在Android应用中灵活运用该类以增强用户体验。

package wuyou.com.cn.view;

import java.lang.reflect.Method;

import android.content.Context;
import android.text.Editable;
import android.text.Selection;
import android.text.Spannable;
import android.text.TextUtils;
import android.text.method.ArrowKeyMovementMethod;
import android.text.method.MovementMethod;
import android.util.AttributeSet;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.inputmethod.EditorInfo;
import android.widget.EditText;
import android.widget.TextView;

/**
 * 可复制的TextView
 *
 * @author DJY
 *
 */
public class TextPage extends TextView {
 public TextPage(Context context)
 {
  super(context, null);
  init();
 }

 @Override
 public boolean onTextContextMenuItem(int id)
 {
  if (id == android.R.id.cut || id == android.R.id.paste)
   return true;
  return super.onTextContextMenuItem(id);
 }

 private void init()
 {
  setFocusableInTouchMode(true);
  setLongClickable(true);
  setCursorVisible(false);
  setImeOptions(EditorInfo.TYPE_CLASS_TEXT);
  try
  {
   Class<EditText> cls = EditText.class;
   Method setShowSoftInputOnFocus = cls.getMethod("setShowSoftInputOnFocus", boolean.class);
   setShowSoftInputOnFocus.setAccessible(false);
   setShowSoftInputOnFocus.invoke(this, false);
  }
  catch (Exception e)
  {

  }

 }

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

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

 @Override
 protected boolean getDefaultEditable()
 {
  return true;
 }

 @Override
 public Editable getText()
 {
  return (Editable) super.getText();
 }

 @Override
 public void setText(CharSequence text, BufferType type)
 {
  super.setText(text, BufferType.EDITABLE);
 }

 /**
  * Convenience for {@link Selection#setSelection(Spannable, int, int)}.
  */
 public void setSelection(int start, int stop)
 {
  Selection.setSelection(getText(), start, stop);
 }

 /**
  * Convenience for {@link Selection#setSelection(Spannable, int)}.
  */
 public void setSelection(int index)
 {
  Selection.setSelection(getText(), index);
 }

 /**
  * Convenience for {@link Selection#selectAll}.
  */
 public void selectAll()
 {
  Selection.selectAll(getText());
 }

 /**
  * Convenience for {@link Selection#extendSelection}.
  */
 public void extendSelection(int index)
 {
  Selection.extendSelection(getText(), index);
 }

 @Override
 public void setEllipsize(TextUtils.TruncateAt ellipsis)
 {
  if (ellipsis == TextUtils.TruncateAt.MARQUEE)
  {
   throw new IllegalArgumentException("EditText cannot use the ellipsize mode "
     + "TextUtils.TruncateAt.MARQUEE");
  }
  super.setEllipsize(ellipsis);
 }
}

 

import sys from PyQt5.QtWidgets import QApplication, QMainWindow from PyQt5.QtCore import QThread, pyqtSignal from 茶杯狐 import Ui_MainWindow from 多线程批量下载最终版 import pa from functools import partial # 添加partial导入 class DownloadWorker(QThread): progress_signal = pyqtSignal(str) finished_signal = pyqtSignal() progress_bar_signal = pyqtSignal(int) def __init__(self, pa_instance, url, start, end, thread_num): super().__init__() self.pa = pa_instance self.url = url self.start = start self.end = end self.thread_num = thread_num def run(self): sys.stdout = self try: self.pa.bind_write(self.write) self.pa.batch_download_thread_start(self.url, self.start, self.end, self.thread_num) except Exception as e: self.progress_signal.emit(f"下载出错: {e}") finally: self.finished_signal.emit() def write(self, text): try: cleaned_text = text.rstrip('\n') self.progress_signal.emit(cleaned_text) except: pass def flush(self): pass class MainWindow(QMainWindow, Ui_MainWindow): def __init__(self): super().__init__() self.setupUi(self) self.setWindowTitle("m3u8 视频下载器") self.worker = None self.pushButton_7.clicked.connect(self.on_start_button_clicked) def on_start_button_clicked(self): try: if getattr(self, 'worker', None) and self.worker.isRunning(): self.append_log("下载已在运行中,请勿重复点击") return url = self.lineEdit.text() start_text = self.textEdit_2.toPlainText() end_text = self.textEdit_3.toPlainText() thread_text = self.textEdit_4.toPlainText() try: start = int(start_text) end = int(end_text) thread_num = int(thread_text) except ValueError: self.append_log("请输入有效的数字(起始集、结束集、线程数)") return if not url.startswith("http"): self.append_log("请输入有效的 URL") return print(f"url:{url},start:{start},end:{end},thread_num:{thread_num}") self.textEdit.clear() self.worker = DownloadWorker(pa(), url, start, end, thread_num) self.worker.progress_signal.connect(self.append_log) self.worker.progress_bar_signal.connect(self.progressBar.setValue) # 使用partial替代lambda self.worker.finished_signal.connect(partial(self.append_log, "下载完成")) self.worker.start() except Exception as e: print(e) # self.append_log(f"程序发生致命错误: {e}") def append_log(self, text): self.textEdit.append(text) self.textEdit.verticalScrollBar().setValue( self.textEdit.verticalScrollBar().maximum() ) if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec_()) 经过我在pycharm的调试,当调试到self.worker.start(),我点的是单步执行我的代码,没有进入函数,下一步直接到了except Exception as e:报错'int' object is not callable
07-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值