Repository: googlesamples/android-TextSwitcher Branch: master Commit: bbf605648235 Files: 36 Total size: 66.7 KB Directory structure: gitextract_qrqhnn8f/ ├── .google/ │ └── packaging.yaml ├── Application/ │ ├── build.gradle │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ ├── java/ │ │ └── com/ │ │ └── example/ │ │ └── android/ │ │ ├── common/ │ │ │ └── logger/ │ │ │ ├── Log.java │ │ │ ├── LogFragment.java │ │ │ ├── LogNode.java │ │ │ ├── LogView.java │ │ │ ├── LogWrapper.java │ │ │ └── MessageOnlyLogFilter.java │ │ └── textswitcher/ │ │ └── MainActivity.java │ └── res/ │ ├── layout/ │ │ └── sample_main.xml │ ├── values/ │ │ ├── base-strings.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ ├── template-dimens.xml │ │ └── template-styles.xml │ ├── values-sw600dp/ │ │ ├── dimens.xml │ │ ├── template-dimens.xml │ │ └── template-styles.xml │ ├── values-sw720dp-land/ │ │ └── dimens.xml │ ├── values-v11/ │ │ ├── styles.xml │ │ └── template-styles.xml │ ├── values-v14/ │ │ └── styles.xml │ └── values-v21/ │ ├── base-colors.xml │ └── base-template-styles.xml ├── CONTRIB.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── build.gradle ├── gradle/ │ └── wrapper/ │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── packaging.yaml └── settings.gradle ================================================ FILE CONTENTS ================================================ ================================================ FILE: .google/packaging.yaml ================================================ # GOOGLE SAMPLE PACKAGING DATA # # This file is used by Google as part of our samples packaging process. # End users may safely ignore this file. It has no relevance to other systems. --- status: PUBLISHED technologies: [Android] categories: [UI] languages: [Java] solutions: [Mobile] github: android-TextSwitcher level: INTERMEDIATE icon: screenshots/icon-web.png apiRefs: - android:android.widget.TextSwitcher license: apache2 ================================================ FILE: Application/build.gradle ================================================ buildscript { repositories { jcenter() google() } dependencies { classpath 'com.android.tools.build:gradle:3.0.1' } } apply plugin: 'com.android.application' repositories { jcenter() google() } dependencies { compile "com.android.support:support-v4:27.0.2" compile "com.android.support:gridlayout-v7:27.0.2" compile "com.android.support:cardview-v7:27.0.2" compile "com.android.support:appcompat-v7:27.0.2" } // The sample build uses multiple directories to // keep boilerplate and common code separate from // the main sample code. List dirs = [ 'main', // main sample code; look here for the interesting stuff. 'common', // components that are reused by multiple samples 'template'] // boilerplate code that is generated by the sample template process android { compileSdkVersion 27 buildToolsVersion "27.0.2" defaultConfig { minSdkVersion 7 targetSdkVersion 27 } compileOptions { sourceCompatibility JavaVersion.VERSION_1_7 targetCompatibility JavaVersion.VERSION_1_7 } sourceSets { main { dirs.each { dir -> java.srcDirs "src/${dir}/java" res.srcDirs "src/${dir}/res" } } androidTest.setRoot('tests') androidTest.java.srcDirs = ['tests/src'] } } ================================================ FILE: Application/src/main/AndroidManifest.xml ================================================ ================================================ FILE: Application/src/main/java/com/example/android/common/logger/Log.java ================================================ /* * Copyright (C) 2013 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.example.android.common.logger; /** * Helper class for a list (or tree) of LoggerNodes. * *

When this is set as the head of the list, * an instance of it can function as a drop-in replacement for {@link android.util.Log}. * Most of the methods in this class server only to map a method call in Log to its equivalent * in LogNode.

*/ public class Log { // Grabbing the native values from Android's native logging facilities, // to make for easy migration and interop. public static final int NONE = -1; public static final int VERBOSE = android.util.Log.VERBOSE; public static final int DEBUG = android.util.Log.DEBUG; public static final int INFO = android.util.Log.INFO; public static final int WARN = android.util.Log.WARN; public static final int ERROR = android.util.Log.ERROR; public static final int ASSERT = android.util.Log.ASSERT; // Stores the beginning of the LogNode topology. private static LogNode mLogNode; /** * Returns the next LogNode in the linked list. */ public static LogNode getLogNode() { return mLogNode; } /** * Sets the LogNode data will be sent to. */ public static void setLogNode(LogNode node) { mLogNode = node; } /** * Instructs the LogNode to print the log data provided. Other LogNodes can * be chained to the end of the LogNode as desired. * * @param priority Log level of the data being logged. Verbose, Error, etc. * @param tag Tag for for the log data. Can be used to organize log statements. * @param msg The actual message to be logged. * @param tr If an exception was thrown, this can be sent along for the logging facilities * to extract and print useful information. */ public static void println(int priority, String tag, String msg, Throwable tr) { if (mLogNode != null) { mLogNode.println(priority, tag, msg, tr); } } /** * Instructs the LogNode to print the log data provided. Other LogNodes can * be chained to the end of the LogNode as desired. * * @param priority Log level of the data being logged. Verbose, Error, etc. * @param tag Tag for for the log data. Can be used to organize log statements. * @param msg The actual message to be logged. The actual message to be logged. */ public static void println(int priority, String tag, String msg) { println(priority, tag, msg, null); } /** * Prints a message at VERBOSE priority. * * @param tag Tag for for the log data. Can be used to organize log statements. * @param msg The actual message to be logged. * @param tr If an exception was thrown, this can be sent along for the logging facilities * to extract and print useful information. */ public static void v(String tag, String msg, Throwable tr) { println(VERBOSE, tag, msg, tr); } /** * Prints a message at VERBOSE priority. * * @param tag Tag for for the log data. Can be used to organize log statements. * @param msg The actual message to be logged. */ public static void v(String tag, String msg) { v(tag, msg, null); } /** * Prints a message at DEBUG priority. * * @param tag Tag for for the log data. Can be used to organize log statements. * @param msg The actual message to be logged. * @param tr If an exception was thrown, this can be sent along for the logging facilities * to extract and print useful information. */ public static void d(String tag, String msg, Throwable tr) { println(DEBUG, tag, msg, tr); } /** * Prints a message at DEBUG priority. * * @param tag Tag for for the log data. Can be used to organize log statements. * @param msg The actual message to be logged. */ public static void d(String tag, String msg) { d(tag, msg, null); } /** * Prints a message at INFO priority. * * @param tag Tag for for the log data. Can be used to organize log statements. * @param msg The actual message to be logged. * @param tr If an exception was thrown, this can be sent along for the logging facilities * to extract and print useful information. */ public static void i(String tag, String msg, Throwable tr) { println(INFO, tag, msg, tr); } /** * Prints a message at INFO priority. * * @param tag Tag for for the log data. Can be used to organize log statements. * @param msg The actual message to be logged. */ public static void i(String tag, String msg) { i(tag, msg, null); } /** * Prints a message at WARN priority. * * @param tag Tag for for the log data. Can be used to organize log statements. * @param msg The actual message to be logged. * @param tr If an exception was thrown, this can be sent along for the logging facilities * to extract and print useful information. */ public static void w(String tag, String msg, Throwable tr) { println(WARN, tag, msg, tr); } /** * Prints a message at WARN priority. * * @param tag Tag for for the log data. Can be used to organize log statements. * @param msg The actual message to be logged. */ public static void w(String tag, String msg) { w(tag, msg, null); } /** * Prints a message at WARN priority. * * @param tag Tag for for the log data. Can be used to organize log statements. * @param tr If an exception was thrown, this can be sent along for the logging facilities * to extract and print useful information. */ public static void w(String tag, Throwable tr) { w(tag, null, tr); } /** * Prints a message at ERROR priority. * * @param tag Tag for for the log data. Can be used to organize log statements. * @param msg The actual message to be logged. * @param tr If an exception was thrown, this can be sent along for the logging facilities * to extract and print useful information. */ public static void e(String tag, String msg, Throwable tr) { println(ERROR, tag, msg, tr); } /** * Prints a message at ERROR priority. * * @param tag Tag for for the log data. Can be used to organize log statements. * @param msg The actual message to be logged. */ public static void e(String tag, String msg) { e(tag, msg, null); } /** * Prints a message at ASSERT priority. * * @param tag Tag for for the log data. Can be used to organize log statements. * @param msg The actual message to be logged. * @param tr If an exception was thrown, this can be sent along for the logging facilities * to extract and print useful information. */ public static void wtf(String tag, String msg, Throwable tr) { println(ASSERT, tag, msg, tr); } /** * Prints a message at ASSERT priority. * * @param tag Tag for for the log data. Can be used to organize log statements. * @param msg The actual message to be logged. */ public static void wtf(String tag, String msg) { wtf(tag, msg, null); } /** * Prints a message at ASSERT priority. * * @param tag Tag for for the log data. Can be used to organize log statements. * @param tr If an exception was thrown, this can be sent along for the logging facilities * to extract and print useful information. */ public static void wtf(String tag, Throwable tr) { wtf(tag, null, tr); } } ================================================ FILE: Application/src/main/java/com/example/android/common/logger/LogFragment.java ================================================ /* * Copyright 2013 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * Copyright 2013 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.example.android.common.logger; import android.graphics.Typeface; import android.os.Bundle; import android.support.v4.app.Fragment; import android.text.Editable; import android.text.TextWatcher; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ScrollView; /** * Simple fraggment which contains a LogView and uses is to output log data it receives * through the LogNode interface. */ public class LogFragment extends Fragment { private LogView mLogView; private ScrollView mScrollView; public LogFragment() {} public View inflateViews() { mScrollView = new ScrollView(getActivity()); ViewGroup.LayoutParams scrollParams = new ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); mScrollView.setLayoutParams(scrollParams); mLogView = new LogView(getActivity()); ViewGroup.LayoutParams logParams = new ViewGroup.LayoutParams(scrollParams); logParams.height = ViewGroup.LayoutParams.WRAP_CONTENT; mLogView.setLayoutParams(logParams); mLogView.setClickable(true); mLogView.setFocusable(true); mLogView.setTypeface(Typeface.MONOSPACE); // Want to set padding as 16 dips, setPadding takes pixels. Hooray math! int paddingDips = 16; double scale = getResources().getDisplayMetrics().density; int paddingPixels = (int) ((paddingDips * (scale)) + .5); mLogView.setPadding(paddingPixels, paddingPixels, paddingPixels, paddingPixels); mLogView.setCompoundDrawablePadding(paddingPixels); mLogView.setGravity(Gravity.BOTTOM); mLogView.setTextAppearance(getActivity(), android.R.style.TextAppearance_Holo_Medium); mScrollView.addView(mLogView); return mScrollView; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View result = inflateViews(); mLogView.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} @Override public void onTextChanged(CharSequence s, int start, int before, int count) {} @Override public void afterTextChanged(Editable s) { mScrollView.fullScroll(ScrollView.FOCUS_DOWN); } }); return result; } public LogView getLogView() { return mLogView; } } ================================================ FILE: Application/src/main/java/com/example/android/common/logger/LogNode.java ================================================ /* * Copyright (C) 2012 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.example.android.common.logger; /** * Basic interface for a logging system that can output to one or more targets. * Note that in addition to classes that will output these logs in some format, * one can also implement this interface over a filter and insert that in the chain, * such that no targets further down see certain data, or see manipulated forms of the data. * You could, for instance, write a "ToHtmlLoggerNode" that just converted all the log data * it received to HTML and sent it along to the next node in the chain, without printing it * anywhere. */ public interface LogNode { /** * Instructs first LogNode in the list to print the log data provided. * @param priority Log level of the data being logged. Verbose, Error, etc. * @param tag Tag for for the log data. Can be used to organize log statements. * @param msg The actual message to be logged. The actual message to be logged. * @param tr If an exception was thrown, this can be sent along for the logging facilities * to extract and print useful information. */ public void println(int priority, String tag, String msg, Throwable tr); } ================================================ FILE: Application/src/main/java/com/example/android/common/logger/LogView.java ================================================ /* * Copyright (C) 2013 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.example.android.common.logger; import android.app.Activity; import android.content.Context; import android.util.*; import android.widget.TextView; /** Simple TextView which is used to output log data received through the LogNode interface. */ public class LogView extends TextView implements LogNode { public LogView(Context context) { super(context); } public LogView(Context context, AttributeSet attrs) { super(context, attrs); } public LogView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } /** * Formats the log data and prints it out to the LogView. * @param priority Log level of the data being logged. Verbose, Error, etc. * @param tag Tag for for the log data. Can be used to organize log statements. * @param msg The actual message to be logged. The actual message to be logged. * @param tr If an exception was thrown, this can be sent along for the logging facilities * to extract and print useful information. */ @Override public void println(int priority, String tag, String msg, Throwable tr) { String priorityStr = null; // For the purposes of this View, we want to print the priority as readable text. switch(priority) { case android.util.Log.VERBOSE: priorityStr = "VERBOSE"; break; case android.util.Log.DEBUG: priorityStr = "DEBUG"; break; case android.util.Log.INFO: priorityStr = "INFO"; break; case android.util.Log.WARN: priorityStr = "WARN"; break; case android.util.Log.ERROR: priorityStr = "ERROR"; break; case android.util.Log.ASSERT: priorityStr = "ASSERT"; break; default: break; } // Handily, the Log class has a facility for converting a stack trace into a usable string. String exceptionStr = null; if (tr != null) { exceptionStr = android.util.Log.getStackTraceString(tr); } // Take the priority, tag, message, and exception, and concatenate as necessary // into one usable line of text. final StringBuilder outputBuilder = new StringBuilder(); String delimiter = "\t"; appendIfNotNull(outputBuilder, priorityStr, delimiter); appendIfNotNull(outputBuilder, tag, delimiter); appendIfNotNull(outputBuilder, msg, delimiter); appendIfNotNull(outputBuilder, exceptionStr, delimiter); // In case this was originally called from an AsyncTask or some other off-UI thread, // make sure the update occurs within the UI thread. ((Activity) getContext()).runOnUiThread( (new Thread(new Runnable() { @Override public void run() { // Display the text we just generated within the LogView. appendToLog(outputBuilder.toString()); } }))); if (mNext != null) { mNext.println(priority, tag, msg, tr); } } public LogNode getNext() { return mNext; } public void setNext(LogNode node) { mNext = node; } /** Takes a string and adds to it, with a separator, if the bit to be added isn't null. Since * the logger takes so many arguments that might be null, this method helps cut out some of the * agonizing tedium of writing the same 3 lines over and over. * @param source StringBuilder containing the text to append to. * @param addStr The String to append * @param delimiter The String to separate the source and appended strings. A tab or comma, * for instance. * @return The fully concatenated String as a StringBuilder */ private StringBuilder appendIfNotNull(StringBuilder source, String addStr, String delimiter) { if (addStr != null) { if (addStr.length() == 0) { delimiter = ""; } return source.append(addStr).append(delimiter); } return source; } // The next LogNode in the chain. LogNode mNext; /** Outputs the string as a new line of log data in the LogView. */ public void appendToLog(String s) { append("\n" + s); } } ================================================ FILE: Application/src/main/java/com/example/android/common/logger/LogWrapper.java ================================================ /* * Copyright (C) 2012 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.example.android.common.logger; import android.util.Log; /** * Helper class which wraps Android's native Log utility in the Logger interface. This way * normal DDMS output can be one of the many targets receiving and outputting logs simultaneously. */ public class LogWrapper implements LogNode { // For piping: The next node to receive Log data after this one has done its work. private LogNode mNext; /** * Returns the next LogNode in the linked list. */ public LogNode getNext() { return mNext; } /** * Sets the LogNode data will be sent to.. */ public void setNext(LogNode node) { mNext = node; } /** * Prints data out to the console using Android's native log mechanism. * @param priority Log level of the data being logged. Verbose, Error, etc. * @param tag Tag for for the log data. Can be used to organize log statements. * @param msg The actual message to be logged. The actual message to be logged. * @param tr If an exception was thrown, this can be sent along for the logging facilities * to extract and print useful information. */ @Override public void println(int priority, String tag, String msg, Throwable tr) { // There actually are log methods that don't take a msg parameter. For now, // if that's the case, just convert null to the empty string and move on. String useMsg = msg; if (useMsg == null) { useMsg = ""; } // If an exeption was provided, convert that exception to a usable string and attach // it to the end of the msg method. if (tr != null) { msg += "\n" + Log.getStackTraceString(tr); } // This is functionally identical to Log.x(tag, useMsg); // For instance, if priority were Log.VERBOSE, this would be the same as Log.v(tag, useMsg) Log.println(priority, tag, useMsg); // If this isn't the last node in the chain, move things along. if (mNext != null) { mNext.println(priority, tag, msg, tr); } } } ================================================ FILE: Application/src/main/java/com/example/android/common/logger/MessageOnlyLogFilter.java ================================================ /* * Copyright (C) 2013 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.example.android.common.logger; /** * Simple {@link LogNode} filter, removes everything except the message. * Useful for situations like on-screen log output where you don't want a lot of metadata displayed, * just easy-to-read message updates as they're happening. */ public class MessageOnlyLogFilter implements LogNode { LogNode mNext; /** * Takes the "next" LogNode as a parameter, to simplify chaining. * * @param next The next LogNode in the pipeline. */ public MessageOnlyLogFilter(LogNode next) { mNext = next; } public MessageOnlyLogFilter() { } @Override public void println(int priority, String tag, String msg, Throwable tr) { if (mNext != null) { getNext().println(Log.NONE, null, msg, null); } } /** * Returns the next LogNode in the chain. */ public LogNode getNext() { return mNext; } /** * Sets the LogNode data will be sent to.. */ public void setNext(LogNode node) { mNext = node; } } ================================================ FILE: Application/src/main/java/com/example/android/textswitcher/MainActivity.java ================================================ /* * Copyright 2013 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.example.android.textswitcher; import android.app.Activity; import android.os.Bundle; import android.view.Gravity; import android.view.View; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.Button; import android.widget.TextSwitcher; import android.widget.TextView; import android.widget.ViewSwitcher.ViewFactory; /** * This sample shows the use of the {@link android.widget.TextSwitcher} View with animations. A * {@link android.widget.TextSwitcher} is a special type of {@link android.widget.ViewSwitcher} that animates * the current text out and new text in when * {@link android.widget.TextSwitcher#setText(CharSequence)} is called. */ public class MainActivity extends Activity { private TextSwitcher mSwitcher; private int mCounter = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.sample_main); // Get the TextSwitcher view from the layout mSwitcher = (TextSwitcher) findViewById(R.id.switcher); // BEGIN_INCLUDE(setup) // Set the factory used to create TextViews to switch between. mSwitcher.setFactory(mFactory); /* * Set the in and out animations. Using the fade_in/out animations * provided by the framework. */ Animation in = AnimationUtils.loadAnimation(this, android.R.anim.fade_in); Animation out = AnimationUtils.loadAnimation(this, android.R.anim.fade_out); mSwitcher.setInAnimation(in); mSwitcher.setOutAnimation(out); // END_INCLUDE(setup) /* * Setup the 'next' button. The counter is incremented when clicked and * the new value is displayed in the TextSwitcher. The change of text is * automatically animated using the in/out animations set above. */ Button nextButton = (Button) findViewById(R.id.button); nextButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mCounter++; // BEGIN_INCLUDE(settext) mSwitcher.setText(String.valueOf(mCounter)); // END_INCLUDE(settext) } }); // Set the initial text without an animation mSwitcher.setCurrentText(String.valueOf(mCounter)); } // BEGIN_INCLUDE(factory) /** * The {@link android.widget.ViewSwitcher.ViewFactory} used to create {@link android.widget.TextView}s that the * {@link android.widget.TextSwitcher} will switch between. */ private ViewFactory mFactory = new ViewFactory() { @Override public View makeView() { // Create a new TextView TextView t = new TextView(MainActivity.this); t.setGravity(Gravity.TOP | Gravity.CENTER_HORIZONTAL); t.setTextAppearance(MainActivity.this, android.R.style.TextAppearance_Large); return t; } }; // END_INCLUDE(factory) } ================================================ FILE: Application/src/main/res/layout/sample_main.xml ================================================