android pro tips
19 subscribers
5 links
Download Telegram
welcome!
horizontal linear layout by default aligns text views to their baselines

to make layoutParams.gravity work, call isBaselineAligned = false

#sdk #linearlayout #gravity
the letter spacing units in figma and text view are different

use this formula for text view: textview.letterSpacing = figmaSpacing / fontSizeDp

#sdk #design #textview #letterspacing
obsolete since the release of the new logcat in android studio dolphin

the “show only selected application” logcat filter sometimes doesn't show the logs after a crash

to avoid this, create your own filter: edit filter configuration -> add(+) -> enter your app package


#andriodstudio #logcat #crash
libraries often contain strings for many locales that aren’t used in your app

to prevent unused locales from getting into the build, add line like this to the android.defaultConfig in app build.gradle

#library #locale #gradle
even if you chose kotlin when creating a new project, android studio will create a java folder for your code: app/src/main/java

you can easily rename it to kotlin: select java folder, press shift+F6, enter the new name and click refactor

#andriodstudio #newproject
when you create a custom view based on xml layout you extend your class from some view group and also have a root view group in the xml. as a result you get an extra container

to avoid this, use the <merge> tag in the xml as the root tag, and specify tools:parentTag="<your view group>"

#sdk #customview #xml
to apply an alpha (0..255) to your color, you can mask the rgb part, shift the alpha bytes and add it to the rgb part

(color and 0x00ffffff) or (alpha shl 24)

#kotlin #color #alpha
since android 10, there is gesture navigation in the system. if your custom view conflicts with gestures (e.g. drawing or slider), don't forget to add exclusion

it is recommended to override onLayout in your view and set exclusion there whenever the position or size are changed

#sdk #gestures #customview
one of the ways to optimize the recycler view is to call the setHasFixedSize(true). there is a common misunderstanding about what this method means

what it really means is that the recycler view should not change its size depending on its content, e.g. the number of items. this way it allows to optimize re-measuring

#library #recyclerview #optimization
when you create a widget – you need to set the preview

there is a wonderful utility for this

#tool #widget #preview
obsolete since the release of the new logcat in android studio dolphin

in the logcat search field in android studio there is a dropdown list of recent searches

to open it – hover your mouse over the search icon,
or when the search field is focused, press alt+down or option+down for mac

#androidstudio #logcat #hotkey
if you are developing a customizable widget, it's a good idea to give users a preview

remote views class has a special RemoteViews#apply method that inflates remote views into a regular view hierarchy, which you can add to the interface

#sdk #widget #remoteviews #preview
when you turn on show layout bounds in the developer menu, you may see these four squares in the corners and a crosshair on some views

this is just an indication that the view has focus at the moment

#sdk #focus #debug
if you want to make a special preview for your custom view, or if you don't want to do some work if it is a preview, you need to know where the view is drawn

there is a method View#isInEditMode, which returns true if the view is drawn in the layout editor

#sdk #customview #layouteditor
if you use ellipsize = TextUtils.TruncateAt.END or android:ellipsize="end", you should keep in mind a few things

do not use wrap content for the layout width, and remember to specify maxLines, otherwise ellipsize will not work

#sdk #textview #ellipsize
if your app does not require multi-touch support on every screen, it can be disabled by adding this lines to your app theme

#sdk #multitouch #theme
<item name="android:windowEnableSplitTouch">false</item>
<item name="android:splitMotionEvents">false</item>
if your application is declared to use the Manifest.permission.CAMERA, which is not granted, trying to use the MediaStore.ACTION_IMAGE_CAPTURE action
will result in a SecurityException

however, you can bypass this restriction by using a similar action – MediaStore.ACTION_IMAGE_CAPTURE_SECURE

#sdk #permission #camera
sometimes you need to create an activity the only purpose of which will be to perform some action and finish immediately. these activities do not actually display the user interface, they finish themselves before they are resumed

there is a theme for such activities that you can use – android:Theme.NoDisplay

#sdk #theme #activity
there are scenarios where you cannot run the application with the debugger, for example when the application process is restarted.

to be able to attach the debugger in the right place there is a method Debug.waitForDebugger(). it will block execution until you attach the debugger manually

#sdk #debug #restart