в .xml:
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textIsSelectable="true" />
в .class:
textview.setCustomSelectionActionModeCallback(new callback(textview));
...
public class callback implements Callback {
private TextView mTextView;
public callback(TextView text) {
this.mTextView = text;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
int start = mTextView.getSelectionStart();
int end = mTextView.getSelectionEnd();
Spannable wordtoSpan = (Spannable) mTextView.getText();
switch (item.getItemId()) {
case R.id.item_blue:
wordtoSpan.setSpan(new BackgroundColorSpan(Color.BLUE), start
, end,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
singlenton.getInstance().getDatabase().createMarkText(mTextView,Color.BLUE);
return true;
case R.id.item_green:
wordtoSpan.setSpan(new BackgroundColorSpan(Color.GREEN), start, end,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
singlenton.getInstance().getDatabase().createMarkText(mTextView,Color.GREEN);
return true;
case R.id.item_red:
wordtoSpan.setSpan(new BackgroundColorSpan(Color.RED), start, end,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
singlenton.getInstance().getDatabase().createMarkText(mTextView,Color.RED);
return true;
case R.id.item_yellow:
wordtoSpan.setSpan(new BackgroundColorSpan(Color.YELLOW), start, end,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
singlenton.getInstance().getDatabase().createMarkText(mTextView,Color.YELLOW);
return true;
case R.id.item_erase:
wordtoSpan.setSpan(new BackgroundColorSpan(Color.TRANSPARENT), start, end,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
singlenton.getInstance().getDatabase().createMarkText(mTextView,Color.TRANSPARENT);
return true;
}
return false;
}
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
mode.setTitle("Selecione a cor");
mode.getMenuInflater().inflate(R.menu.menu_text_context, menu);
return true;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
menu.removeItem(android.R.id.selectAll);
// Remove the "cut" option
menu.removeItem(android.R.id.cut);
// Remove the "copy all" option
menu.removeItem(android.R.id.copy);
return true;
}
}
Итак, я предполагаю, что вы берете список файлов, и те столбцы, о которых вы упоминали [0,1,2], ссылаются на последние строки каждого файла в вашем списке. Имея это в виду, я бы попробовал более простой подход вместо фрейма данных. И даже если вам нужно использовать фрейм данных по другим причинам, возможно, вы можете преобразовать его в текст в качестве последнего шага и попробовать это:
Example File ("ExampleText2"):
I love coffee
I love creamer
I love coffee and creamer
I have a rash..
Код:
last = []
with open('exampleText2.txt', 'r') as f:
last = f.readlines()[-1] + " other FileName"
Вывод: [ 114]
последнее «у меня сыпь .. другое имя файла»
blockquote> blockquote> blockquote>readlines () вернет список из всех строк в вашем файле, так что вы можете попробовать вызвать -1, чтобы вытянуть последнюю строку, а затем добавить к ней.
Вопрос плохо определен, но если предположить, что OP хочет получить результат, показанный в примере DataFrame (то есть не только последняя строка каким-то образом украшена именем файла, но все строки), здесь есть способ добиться этого. Для этого примера у нас есть только два файла: file1.txt
содержит две строки: «a» и «b», file2.txt
содержит одну строку: «c».
Мы пишем средство чтения файлов, которое возвращает список списков: каждый подсписок содержит имя файла и строку.
import glob
def get_file(filename):
with open(filename) as f:
return [[filename, line.rstrip('\n')] for line in f]
Попробуйте:
m = map(get_file, glob.glob('file*.txt'))
list(m)
Out[]:
[[['file2.txt', 'c']], [['file1.txt', 'a'], ['file1.txt', 'b']]]
Давайте сгладим эти списки, чтобы получить один двумерный массив. Кроме того, вероятно, лучше получить результат, когда файлы отсортированы в алфавитном порядке.
def flatten(m):
return [k for sublist in m for k in sublist]
m = map(get_file, sorted(glob.glob('file*.txt')))
flatten(m)
Out[]:
[['file1.txt', 'a'], ['file1.txt', 'b'], ['file2.txt', 'c']]
Теперь иногда полезно иметь номер строки (например, если мы собираемся поместить эти данные в DataFrame и выполнить дальнейшую сортировку и аналитику). Наш читатель становится:
def get_file(filename):
with open(filename) as f:
return [[filename, lineno, line.rstrip('\n')] for lineno, line in enumerate(f, start=1)]
m = map(get_file, sorted(glob.glob('file*.txt')))
out = pd.DataFrame(flatten(m), columns=['filename', 'lineno', 'line'])
out
Out[]:
filename lineno line
0 file1.txt 1 a
1 file1.txt 2 b
2 file2.txt 1 c
Обратите внимание, что вышеприведенный map
прекрасно подходит для многопоточного чтения, если у нас есть большое количество файлов:
from concurrent.futures import ThreadPoolExecutor
with ThreadPoolExecutor(max_workers=4) as pool:
m = pool.map(get_file, sorted(glob.glob('file*.txt')))
out = pd.DataFrame(flatten(m), columns=['filename', 'lineno', 'line'])
out
Out[]:
filename lineno line
0 file1.txt 1 a
1 file1.txt 2 b
2 file2.txt 1 c