String fontPath ="fonts/smartoff.net_verdana.ttf";
int[] array_id_font=new int[]{R.id.umivanie_text,R.id.eda_text,R.id.son_text};
Typeface verdana;
Хочу при помощи метода менять шрифт во всех активностях.
Делаю так:
public void setFont()
{
verdana = Typeface.createFromAsset(getAssets(), fontPath);
for (int i=0;i
Ответы
Ответ 1
создать базовый класс для активити
public class BaseActivity extends AppCompatActivity {
protected String fontPath ="fonts/smartoff.net_verdana.ttf";
private Typeface typeface;
protected int[] getTextViewsResIds() {
return new int[0];
}
public void setFont() {
typeface = Typeface.createFromAsset(getAssets(), fontPath);
for (int i = 0; i
Итак, есть layout, содержащий 2 объекта — RecycledView и TextView. RecyclerView работает
через адаптер, который передаёт значение в TextView. Выглядит это так. Фрагмент, содержащий
TextView:
public class FragmentCharts extends Fragment {
//объявляем TextView
TextView chartDetailsHeader;
public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_charts, container, false);
RecyclerView rationsChart = (RecyclerView) view.findViewById(R.id.rations_chart);
rationsChart.setHasFixedSize(true);
LinearLayoutManager rationsChartLayoutManager = new LinearLayoutManager(
getContext(),
LinearLayoutManager.HORIZONTAL,
true);
rationsChart.setLayoutManager(rationsChartLayoutManager);
ChartAdapter chartAdapter = new ChartAdapter();
rationsChart.setAdapter(chartAdapter);
//инициализируем TextView
chartDetailsHeader = (TextView) view.findViewById(R.id.chart_details_heading);
chartDetailsHeader.setTypeface(CommonSettings.getRobotoCondLight());
return view;
}
//метод для изменения значения TextView
public void setChartHeader(Date date) {
SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM", Locale.US);
String s = dateFormat.format(date);
chartDetailsHeader.setText(s);
}
}
Изменение TextView происходит отправкой метода из адаптера:
new FragmentCharts().setChartHeader(archivesForCharts.get(0).get(0).getDate());
Как я понимаю, при создании new FragmentCharts() должна происходить инициализация
TextView, но в методе setChartHeader() значение TextView почему-то null.
Пытался инициализировать TextView повторно в setChartsHeader(), но где взять view
для инициализации?
В общем, как обычно, нужна помощь.
Ответы
Ответ 1
Ваш код new FragmentCharts().setChartHeader(archivesForCharts.get(0).get(0).getDate());
каждый раз создаёт новый фрагмент. Но так как он ни куда не аттачится и не отображается,
соответственно у него не вызываются никакие методы жизненного цикла, в том числе и
onCreateView, в котором вы инициализируете TextView. Поэтому он и null.
Как решить? Не создавать новый объект фрагмента, а вызывать метод у существующего.
То есть, например, добавить в конструктор адаптера параметр FragmentCharts fragment,
и обращаться уже к нему. Во фрагменте у вас будет:
ChartAdapter chartAdapter = new ChartAdapter(this);
А в адапрере:
private FragmentCharts fragment;
public ChartAdapter(FragmentCharts fragment) {
this.fragment = fragment;
}
...
fragment.setChartHeader(archivesForCharts.get(0).get(0).getDate());
...
Долго искал код для того чтобы сделать кастомный шрифт на все приложение
и наконец то нашел его! Огромное спасибо Глебу Кравченко!
Ссылка на источник: http://dajver.blogspot.com/2014/10/blog-post.html
Ответы
Ответ 1
Суть в том, что нам необходимо создать класс-утилиту которая будет создавать TypeFace
и конвертировать все вьюхи в нужный нам шрифт, вот как он будет выглядеть:
import android.content.Context;
import android.graphics.Typeface;
import java.lang.reflect.Field;
public class TypefaceUtil {
public static void overrideFont(Context context, String defaultFontNameToOverride,
String customFontFileNameInAssets) {
try {
final Typeface customFontTypeface = Typeface.createFromAsset(context.getAssets(),
customFontFileNameInAssets);
final Field defaultFontTypefaceField = Typeface.class.getDeclaredField(defaultFontNameToOverride);
defaultFontTypefaceField.setAccessible(true);
defaultFontTypefaceField.set(null, customFontTypeface);
} catch (Exception e) {}
}
}
Затем необходимо создать папку assets и в ней создать папку fonts для наших шрифтов.
Далее нужно добавить эту строку в главное активити, в метод onCreate:
TypefaceUtil.overrideFont(getApplicationContext(), "SANS_SERIF", "fonts/Roboto-Regular.ttf");
Вместо "Roboto-Regular.ttf" вы указываете свой шрифт.
Также можно сделать этот код на какую-нибудь кнопку.
И в заключении добавляете в файл styles.xml эти строки:
Все! Запускаете приложение и наслаждаетесь)
помогите с созданием ссылок TextView пожалуйста, перепробовал много вариантов никакой
не помогает, выходит ошибка java.lang.NullPointerException
пробовал эти варианты:
1) добавить слушателя
texttest.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view)
{
Uri adress= Uri.parse("www.google.ru");
Intent browser= new Intent(Intent.ACTION_VIEW, adress);
startActivity(browser);
}
});
2)
TextView clickableTextLink = (TextView)findViewById(R.id.textView_About);
clickableTextLink.setMovementMethod(LinkMovementMethod.getInstance());
3) Этот способ работает, но не получается создать ссылку вида
Google
Ответы
Ответ 1
Сложный способ позволяющий не только сделать ссылки кликабельными, но и отловить
нажатие на них:
Берём обычный TextView:
Создаём класс для обработки нажатий на ссылки в тексте:
public class MakeLinksClicable
{
private final static String LOG = MakeLinksClicable.class.getSimpleName();
public static class CustomerTextClick extends ClickableSpan
{
String mUrl;
public CustomerTextClick(String url)
{
mUrl = url;
}
@Override
public void onClick(View widget)
{
//Тут можно как-то обработать нажатие на ссылку
//Сейчас же мы просто открываем браузер с ней
Log.i(LOG, "url clicked: " + this.mUrl);
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(mUrl));
widget.getContext().startActivity(i);
}
}
public static SpannableStringBuilder reformatText(CharSequence text)
{
int end = text.length();
Spannable sp = (Spannable) text;
URLSpan[] urls = sp.getSpans(0, end, URLSpan.class);
SpannableStringBuilder style = new SpannableStringBuilder(text);
for (URLSpan url : urls)
{
style.removeSpan(url);
MakeLinksClicable.CustomerTextClick click = new MakeLinksClicable.CustomerTextClick(url.getURL());
style.setSpan(click, sp.getSpanStart(url), sp.getSpanEnd(url),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
return style;
}
}
Присваиваиваем TextView текст, указав ему, что он в HTML формате и кликабельный и
ловим клики на ссылки с помощью класса из предыдущего пункта:
TextView textView = ... //находим TextView
//Экранируем кавычки в атрибуте html тега слэшем:
String textWithLink = "Google";
//Указываем с помощью Html.fromHtml, что у нас не просто текст:
textView.setText(Html.fromHtml(textWithLink, null, null));
////Указываем что разрешаем ссылки кликать:
textView.setLinksClickable(true);
textView.setMovementMethod(LinkMovementMethod.getInstance());
//Научаемся отлавливать клики пропустив текст через наш класс из пред. пункта.
CharSequence text = textView.getText();
if (text instanceof Spannable)
{
textView.setText(MakeLinksClicable.reformatText(text));
}
Итого:
Ссылка в TextView окрасится дефолтным цветом выделения ссылок, а при нажатии на неё
в логи выведется адрес и запустится браузер с этой ссылкой.
UPD_0:
Чтобы дополнить вопрос - нажмите "править" - см. скриншот.
Если заявленная в вопросе проблема решена - вопрос надо отметить верным, нажав на
"галочку" слева от тела вопроса.
Если в процессе решения родился новый вопрос - задавайте новый вопрос отдельным постом
на сайте. Смысл сайта: один вопрос - один ответ.
Ответ 2
Весь код выкиньте оставьте только разметку.
И все.
В layout присутствуют несколько вертикально расположенных TextView но отображается
только один,верхний.
Что не так, как исправить?
Ответы
Ответ 1
android:layout_height="match_parent"
изменить на
android:layout_height="wrap_content"
или какое-то значение в dp. Первый элемент у Вас растягивается на весь экран и остальные,
соответственно, уже сжаты в 0.
Есть к примеру текст "10/5" и как в TextView сделать чтоб к примеру число 10 было
зеленым цветом, слэш серым, а число 5 красным
Ответы
Ответ 1
Можно избежать использования HTML при помощи такого способа:
TextView TV = (TextView)findViewById(R.id.mytextview01);
Spannable word = new SpannableString("Your message");
word.setSpan(new ForegroundColorSpan(Color.BLUE), 0, word.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
TV.setText(word);
Spannable wordTwo = new SpannableString("Your new message");
wordTwo.setSpan(new ForegroundColorSpan(Color.RED), 0, wordTwo.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
TV.append(wordTwo);
Ответ 2
TextView поддерживает простейшие теги HTML, вроде . Использовать можно так:
textView.setText(HTML.fromHtml("10/5"));
Я с помощью BaseAdapter устанавливаю в ListView XML файл со своей разметкой. В ListView
в каждой строчке должно быть 3 столбца каждый из которых должен занимать 33% по ширине.
Не больше ни меньше!
**Вот я собираю такой XML : **
Но все равно когда я устанавливаю в первое TextView текст, то он растягивается на
где то на 70% по горизонтали, а остальные 2 TextView разделяют между собой остальных
30%. Я рассчитывал что каждый item займет третью часть по горизонтали.
Что я делаю не так?
Ответы
Ответ 1
Ответ 2
Установите у всех TextView ширину в 0:
android:layout_width="0dp"
Создаю список из БД, при этом пытаюсь найти TextView в другом Layout (item.xml),
чтобы вставить в него текст.
Почему при запуске TextView пустое?
protected void insertElementOfListFromBase(){
View itemLayout = View.inflate(this, R.layout.item, null); //
TextView money_unit = (TextView) itemLayout.findViewById(R.id.money_unit);
money_unit.setText("usd");
String[] from = new String[] { SCHETCHIK, STIOMOST };
int[] to = new int[] { R.id.number, R.id.printStoimost };
scAdapter = new SimpleCursorAdapter(this, R.layout.item, cursor, from, to);
Spisok = (ListView) findViewById(R.id.spisok);
Spisok.setAdapter(scAdapter);
}
Ответы
Ответ 1
Вы создаете View:
View itemLayout = View.inflate(this, R.layout.item, null); //
Делаете с ним манипуляции:
View itemLayout = View.inflate(this, R.layout.item, null); //
TextView money_unit = (TextView) itemLayout.findViewById(R.id.money_unit);
money_unit.setText("usd");
И никуда его не добавляете. Вы просто не выводите его на экран.
Например:
TextView textView = new TextView(PhotoActivity.this);
textView.setText("Photo not found.");
Тогда как задать стиль?
textView.set...???
Мне нужно было сделать цвет текста и позиционирование по центру программно, я решил
задачку:
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(AbsListView.LayoutParams.WRAP_CONTENT,
AbsListView.LayoutParams.FILL_PARENT);
params.weight = 1.0f;
params.gravity = Gravity.CENTER;
TextView textView = new TextView(PhotoActivity.this);
textView.setText("Photo not found.");
textView.setTextColor(Color.WHITE);
textView.setLayoutParams(params);
Как вариант так:
textView.setGravity(Gravity.CENTER);
Это, ксожалению, невозможно.
Но выход есть: Создать xml файл с TextView с нужным стилем:
И дальше программно его инфлейтить:
TextView textView = (TextView) LayoutInflater.from(context).inflate(R.layout.styled_textView,
null);
Если хочется именно программно выбрать стиль, не создавая отдельную разметку для
каждого стиля, можете сохранить один вариант разметки где-нибудь в assets, дальше загружать
его, как обычный XML-документ, изменять ему атрибут style, и скармливать LayoutInflaterу
в этот метод
Необходимо вписать текст в TextView ограниченный кругом. пример
Подскажите, в какую сторону копать
Ответы
Ответ 1
Написал код onDraw(Canvas canvas) своего класса наследника TextViewрешающий задачу
для меня. Комментарии описываю последовательность действий:
@Override
protected void onDraw(Canvas canvas) {
// круг, в который вписан текст
canvas.drawCircle(mRadius, mRadius, mRadius, mGlowPaint);
// высота строки
float textHeight = mTextPaint.getFontSpacing();
// измеряем длинну текста
float widthText = mTextPaint.measureText(mText);
if(widthText <= mRadius*2) {
// всего одна строка помещается - рисуем ее и выходим
canvas.drawText(mText, mRadius, mRadius, mTextPaint);
return;
}
// 1 Делим строку на два, сдвигаем к ближайшему пробелу. получаем индекс пробела,
близкого к середине текста
int centerSpace = calcCenterSpace(mText);
// 2 Сначала рисуем текст вверх :
String leftString = mText.substring(0, centerSpace);
int cnt = 0; // количество прорисованных строк вверх
float widthLine;
int n;
while (true) {
// измеряем длинну строки
widthLine = calcWidthLine(mRadius, textHeight * cnt++);
// считаем сколько символов поместится в новой строке
n = mTextPaint.breakText(leftString, false, widthLine, null);
if (n == 0) // прерываем, так как строка слишком длинная
break;
// создаем строку
int rest = leftString.length() - n;
// проверка на последнюю строку
if (rest != 0) {
String s = leftString.substring(leftString.length() - n);
// обрезаем до первого пробела
int fixed = s.indexOf(' ');
// создаем новую аккуратную строку
s = s.substring(fixed + 1);
// рисуем ее на высоте соответствующую данной строке
canvas.drawText(s, mRadius, mRadius - textHeight * cnt + textHeight,
mTextPaint);
// сокращаем левый кусок текста на длинну отрисованной строки
leftString = leftString.substring(0, leftString.length() - s.length());
} else { // последняя строка
canvas.drawText(leftString, mRadius, mRadius - textHeight * cnt +
textHeight, mTextPaint);
break;
}
}
// 3. Теперь рисуем вниз
String rightString = mText.substring(centerSpace);
cnt = 0; // количество прорисованных строк вверх
while(true){
widthLine = calcWidthLine(mRadius, textHeight * cnt++);
n = mTextPaint.breakText(rightString, false, widthLine, null);
if (n == 0) // прерываем если весь текст не поместился
break;
int rest = rightString.length() - n;
if(rest != 0) {
String s = rightString.substring(0, n);
int fixed = s.lastIndexOf(' ');
s = s.substring(0, fixed);
canvas.drawText(s, mRadius, mRadius + textHeight * cnt, mTextPaint);
rightString = rightString.substring(s.length(), rightString.length());
}
else {
canvas.drawText(rightString, mRadius, mRadius + textHeight * cnt, mTextPaint);
break;
}
}
}
private static int calcWidthLine(float r, float b){
double a = Math.sqrt(r * r - b * b);
return (int)(2*a);
}
private static int calcCenterSpace(String text){
int index = text.length()/2;
if(text.charAt(index) == ' ') return index;
String subLeft = text.substring(0, index);
int indexSpaceLeft = subLeft.lastIndexOf(' ');
String subRight = text.substring(index + 2);
int indexSpaceRight = subRight.indexOf(' ');
if(index - indexSpaceLeft <= indexSpaceRight)
return indexSpaceLeft;
else
return indexSpaceRight;
}
Алгоритм не идеален, на поставленную задачу выполняет. Еще в планах сделать растягивание
строки. Оптимизация и недочеты приветствую.
Вот скриншоты:
Ответ 2
Можно сделать кастомное view с LinearLayout, содержащий TextView различной длины.
Предлагаю следующий алгоритм:
Оценить размер круга, необходимый для размещения данного объема
текста. Для выполнения этого шага нужно учесть остальные.
Построить LinearLayout соответсвующей высоты и ширины.
Разместить по строкам TextView различной длины. Длину определить по длине хорды на
соответвующей высоте текста + высоты самой строки.
Заполнить соответсвующие TextView текстом. Сложности могут возникнуть с
переносом слов и обрывком строк не доходя до круга. Тут можно
использовать свойство letter spacing: брать строки не больше
заданной длины хорды и увеличивать letter-spacing, если строка
меньше чем нужно.
Поделиться реализацией с сообществом :-)
Ответ 3
Создайте в Drawable bg_circle.xml:
Потом примените этот бекграунд к вашему TextView!
Как изменить форму ТеxtView элемента? У меня текст на полупрозрачном прямоугольном
фоне. Как можно сделать прямоугольник другой фигурой?
Ответы
Ответ 1
Все View в Android имеют xml-атрибут android:background (связанный метод: setBackgroundResource()),
который позволяет задать желаемый внешний вид виджета для всех возможных состояний:
нормальное, нажатое, выделенное, неактивное, в фокусе, отмеченное и др. (полный список).
1.Для того, чтобы получить желаемый внешний вид виджета нужно подготовить, собственно,
сам этот вид. Здесь возможны два варианта:
Изображение.
Изображение внешнего вида виджета необходимо подготовить в каком то графическом редакторе
для всех желаемых состояний: нормальное, нажатое, неактивное и другие, которые вам
требуются (не обязательно все, те состояния, для которых вид не будет задан отрабатываться
не будут - видимых изменений при этом состоянии вы не увидите).
Так как наши виджеты имеют обычно заранее не определенные размеры ( то есть могут
увеличиваться или уменьшаться в зависимости от расположенного на них контента, заданных
размеров и тд.), то, как правило, изображения эти следует перевести в формат 9-patch
( задать определенные области в которых изображение будет растягиваться, подстраиваясь
под текущие размеры, а так же область, в которую будет выводиться контент.Подробнее.)
Если виджет имеет только фиксированный размер, то достаточно подготовить несколько
аналогичных изображений для разных плотностей экрана.Подробнее.
За этот способ выступает возможность получить сложный вид, ограниченный только фантазией
художника.
Нарисовать с помощью графических примитивов xml-разметки. Для этого существует xml-атрибут
shape( bc соответствующий класс ShapeDrawable), который позволяет нарисовать точки,
линии, прямоугольники, овалы и некоторое другое, а так же наложить заливку, градиенты,
тени и тому подобное.
За этот способ отличное масштабирование, малый размер и некоторое другое, вроде возможности
изменять цвет динамически. В качестве недостатка относительная простота изображения.
Подготовленные файлы размещаются в папке res/drawable/, либо аналогичных с квалификаторами,
если требуется.
2.После того, как внешний вид готов, нам необходимо создать специальный файл-селектор
StateList, который будет регулировать, каким изображениям\шейпам появляться при определенных
состояниях виджета:
Здесь задана обработка нажатия (state_pressed) - вся строка говорит: если на виджете
фиксируется нажатие (состояние true - истина), то установить в качестве фона виджета
изображение\шейп widget_pressed.
Последним идет элемент без всяких условий - он соответствует нормальному виду виджета
и будет выбран, когда никакое из состояний указанных ранее не было зафиксировано. Выполнение
селектора идет сверху-вниз и будет закончено, когда первое попавшиеся сверху состояние
совпадет с условием.
Данный файл так же распологается в res/drawable/
Если разные виды для определенных состояний не требуются и виджет всегда должен выглядеть
одинаково и при касаниях и при неактивности и пр., то создание селектора можно ( и
нужно) пропустить. Тогда в качестве фона используется статичное, заранее подготовленное
изображение по технологии, описанной в пункте 1.
3.Завершающим штрихом будет установка созданного нами селектора (или статичного фона)
(я назвал его custom_background_selector) в качестве фона виджета:
Как правило, если делается кастомный вид для виджета, то этот виджет не один в приложении
- тогда повторяющиеся атрибуты, в том числе и новый бэкграунд логично вынести в отдельный
стиль (например, для кнопки):
res/values/styles.xml
res/layout/my_layout.xml
Как в TextView записать химическую формулу с верхними и нижними символами?
Как пример - как вывести такую формулу:
Ответы
Ответ 1
Например, с помощью HTML тегов:
Верхний индекс: upper;
Нижний индекс: lower;
String s = "upperlower";
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
mTextView.setText(Html.fromHtml(s, Html.FROM_HTML_MODE_LEGACY));
} else {
mTextView.setText(Html.fromHtml(s));
}
В качестве альтернативного варианта можно использовать SpannableStringBuilder:
SpannableStringBuilder ssb = new SpannableStringBuilder("Cu+6");
ssb.setSpan(new SuperscriptSpan(), 2, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
ssb.setSpan(new RelativeSizeSpan(0.75f), 2, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
ssb.setSpan(new SubscriptSpan(), 3, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
ssb.setSpan(new RelativeSizeSpan(0.75f), 3, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
mTextView.setText(ssb);
UPD: В строке, которая хранится в ресурсах, необходимо заменить < на < (less-than
sign), а > на > (greater-than sign):
<sup>upper</sup><sub>lower</sub>
Например: TextView textView = new TextView(PhotoActivity.this);
textView.setText("Photo not found.");
Тогда как задать стиль? textView.set...???
Мне нужно было сделать цвет текста и позиционирование по центру программно, я решил задачку: LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(AbsListView.LayoutParams.WRAP_CONTENT, AbsListView.LayoutParams.FILL_PARENT);
params.weight = 1.0f;
params.gravity = Gravity.CENTER; TextView textView = new TextView(PhotoActivity.this);
textView.setText("Photo not found.");
textView.setTextColor(Color.WHITE);
textView.setLayoutParams(params);
Как вариант так: textView.setGravity(Gravity.CENTER);
Итак, есть layout, содержащий 2 объекта — RecycledView и TextView. RecyclerView работает через адаптер, который передаёт значение в TextView. Выглядит это так. Фрагмент, содержащий TextView public class FragmentCharts extends Fragment { //объявляем TextView
TextView chartDetailsHeader; public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_charts, container, false); RecyclerView rationsChart = (RecyclerView) view.findViewById(R.id.rations_chart);
rationsChart.setHasFixedSize(true); LinearLayoutManager rationsChartLayoutManager = new LinearLayoutManager(
getContext(),
LinearLayoutManager.HORIZONTAL,
true);
rationsChart.setLayoutManager(rationsChartLayoutManager); ChartAdapter chartAdapter = new ChartAdapter();
rationsChart.setAdapter(chartAdapter); //инициализируем TextView
chartDetailsHeader = (TextView) view.findViewById(R.id.chart_details_heading);
chartDetailsHeader.setTypeface(CommonSettings.getRobotoCondLight());
return view;
} //метод для изменения значения TextView
public void setChartHeader(Date date) {
SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM", Locale.US);
String s = dateFormat.format(date);
chartDetailsHeader.setText(s);
}
}
Изменение TextView происходит отправкой метода из адаптера: new FragmentCharts().setChartHeader(archivesForCharts.get(0).get(0).getDate());
Как я понимаю, при создании new FragmentCharts() должна происходить инициализация TextView, но в методе setChartHeader() значение TextView почему-то null Пытался инициализировать TextView повторно в setChartsHeader(), но где взять view для инициализации? В общем, как обычно, нужна помощь.
Ответ
Ваш код new FragmentCharts().setChartHeader(archivesForCharts.get(0).get(0).getDate()); каждый раз создаёт новый фрагмент. Но так как он ни куда не аттачится и не отображается, соответственно у него не вызываются никакие методы жизненного цикла, в том числе и onCreateView, в котором вы инициализируете TextView. Поэтому он и null Как решить? Не создавать новый объект фрагмента, а вызывать метод у существующего. То есть, например, добавить в конструктор адаптера параметр FragmentCharts fragment, и обращаться уже к нему. Во фрагменте у вас будет: ChartAdapter chartAdapter = new ChartAdapter(this);
А в адапрере: private FragmentCharts fragment; public ChartAdapter(FragmentCharts fragment) {
this.fragment = fragment;
}
...
fragment.setChartHeader(archivesForCharts.get(0).get(0).getDate());
...
помогите с созданием ссылок TextView пожалуйста, перепробовал много вариантов никакой не помогает, выходит ошибка java.lang.NullPointerException пробовал эти варианты: 1) добавить слушателя texttest.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View view)
{
Uri adress= Uri.parse("www.google.ru");
Intent browser= new Intent(Intent.ACTION_VIEW, adress);
startActivity(browser);
} });
2) TextView clickableTextLink = (TextView)findViewById(R.id.textView_About);
clickableTextLink.setMovementMethod(LinkMovementMethod.getInstance());
3) Этот способ работает, но не получается создать ссылку вида Google
Ответ
Сложный способ позволяющий не только сделать ссылки кликабельными, но и отловить нажатие на них:
Берём обычный TextView
Создаём класс для обработки нажатий на ссылки в тексте: public class MakeLinksClicable
{
private final static String LOG = MakeLinksClicable.class.getSimpleName(); public static class CustomerTextClick extends ClickableSpan
{
String mUrl; public CustomerTextClick(String url)
{
mUrl = url;
} @Override
public void onClick(View widget)
{
//Тут можно как-то обработать нажатие на ссылку
//Сейчас же мы просто открываем браузер с ней
Log.i(LOG, "url clicked: " + this.mUrl); Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(mUrl));
widget.getContext().startActivity(i);
}
} public static SpannableStringBuilder reformatText(CharSequence text)
{
int end = text.length();
Spannable sp = (Spannable) text;
URLSpan[] urls = sp.getSpans(0, end, URLSpan.class);
SpannableStringBuilder style = new SpannableStringBuilder(text);
for (URLSpan url : urls)
{
style.removeSpan(url);
MakeLinksClicable.CustomerTextClick click = new MakeLinksClicable.CustomerTextClick(url.getURL());
style.setSpan(click, sp.getSpanStart(url), sp.getSpanEnd(url),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
} return style;
}
}
Присваиваиваем TextView текст, указав ему, что он в HTML формате и кликабельный и ловим клики на ссылки с помощью класса из предыдущего пункта: TextView textView = ... //находим TextView
//Экранируем кавычки в атрибуте html тега слэшем:
String textWithLink = "Google";
//Указываем с помощью Html.fromHtml, что у нас не просто текст:
textView.setText(Html.fromHtml(textWithLink, null, null));
////Указываем что разрешаем ссылки кликать:
textView.setLinksClickable(true);
textView.setMovementMethod(LinkMovementMethod.getInstance());
//Научаемся отлавливать клики пропустив текст через наш класс из пред. пункта.
CharSequence text = textView.getText();
if (text instanceof Spannable)
{
textView.setText(MakeLinksClicable.reformatText(text));
}
Итого: Ссылка в TextView окрасится дефолтным цветом выделения ссылок, а при нажатии на неё в логи выведется адрес и запустится браузер с этой ссылкой. UPD_0:
Чтобы дополнить вопрос - нажмите "править" - см. скриншот.
Если заявленная в вопросе проблема решена - вопрос надо отметить верным, нажав на "галочку" слева от тела вопроса.
Если в процессе решения родился новый вопрос - задавайте новый вопрос отдельным постом на сайте. Смысл сайта: один вопрос - один ответ.
В layout присутствуют несколько вертикально расположенных TextView но отображается только один,верхний. Что не так, как исправить?
Ответ
android:layout_height="match_parent"
изменить на android:layout_height="wrap_content"
или какое-то значение в dp. Первый элемент у Вас растягивается на весь экран и остальные, соответственно, уже сжаты в 0.
Есть к примеру текст "10/5" и как в TextView сделать чтоб к примеру число 10 было зеленым цветом, слэш серым, а число 5 красным
Ответ
Можно избежать использования HTML при помощи такого способа: TextView TV = (TextView)findViewById(R.id.mytextview01);
Spannable word = new SpannableString("Your message"); word.setSpan(new ForegroundColorSpan(Color.BLUE), 0, word.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); TV.setText(word);
Spannable wordTwo = new SpannableString("Your new message"); wordTwo.setSpan(new ForegroundColorSpan(Color.RED), 0, wordTwo.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
TV.append(wordTwo);
Я с помощью BaseAdapter устанавливаю в ListView XML файл со своей разметкой. В ListView в каждой строчке должно быть 3 столбца каждый из которых должен занимать 33% по ширине. Не больше ни меньше! **Вот я собираю такой XML : ** Но все равно когда я устанавливаю в первое TextView текст, то он растягивается на где то на 70% по горизонтали, а остальные 2 TextView разделяют между собой остальных 30%. Я рассчитывал что каждый item займет третью часть по горизонтали.
Что я делаю не так?