Sample project created to show some of the best Android practices to work in the Android UI Layer. The UI layer of this project has been implemented using MVP or MVVM (without binding engine) to show how this patterns works. This project is used during the talk "EffectiveAndroidUI".

Overview

Effective Android UI Build Status Android Arsenal

Sample project created to reinforce some of the main concepts described in the tech talk "Effective Android UI".

In this repository you are going to find some interesting samples like:

  • MVP and MVVM (without data binding engine) samples.
  • How to use fragments.
  • How to use Dagger to implement dependency injection.
  • Use resource qualifiers to change the layout used in different screen sizes.
  • Use resource qualifiers to change the layout used in different screen densities.
  • Use resource qualifiers to change the layout in different Android version.
  • How to use styles and themes.
  • How to communicate fragments in the same activity.
  • Butterknife library usage to avoid UI duplicated code.
  • Uniform naming for Android resources.
  • How to use Navigator or ActionCommands to implement the navigation inside the application.
  • Use resource custom qualifiers to split resource files by domain.
  • Different layout usage: RelativeLayout, LinearLayout, FrameLayout.
  • Usage of merge, include and view stub.
  • Correct ListView implementation with view recycle using Renderers.
  • Interactor implementation described in the talk "Software Design Patterns on Android".
  • Usage of Dagger to implement two different scopes: Application scope and Activity scope.

Implementation description

EffectiveAndroid UI Video - Spanish

EffectiveAndroid UI Slides - English

Screenshots

Demo Screenshot 1 Demo Screenshot 2 Demo Screenshot 3

Libraries used on the sample project

Developed By

Follow me on Twitter Add me to Linkedin

License

Copyright 2014 Pedro Vicente Gómez Sánchez

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.
Comments
  • Error:Could not find com.android.support:appcompat-v7:19.1.0.

    Error:Could not find com.android.support:appcompat-v7:19.1.0.

    Hi Sir, I tried your example but I'm having issue in importing it into Android Studio. Below is the error im having. I already installed the Android Support Repository but still got this error. Btw, im still new to using gradle build. Hoping that you can help me.

    Error:Could not find com.android.support:appcompat-v7:19.1.0. Required by: EffectiveAndroidUI-master:app:unspecified

    Please install the Android Support Repository from the Android SDK Manager. Open Android SDK Manager

    thanks

    opened by chkm8 7
  • Considering activity lifecycle

    Considering activity lifecycle

    Hi, first of all thank you for your work. One think i didn't understand is how to deal with the lifecycle of the activities related to the jobexecutor as the jobs are running in a threadpool and i need the possibility to cancel a job (while navigating through activities). Can you give an example how you would integrate for example Loaders (or is using loaders not a good approach in this architecture) or RxJava? Another question is, when and how to cleanup references (like callback in interactor, when presenter is no more interested in interactor results).

    question 
    opened by misrakli 3
  • Ups! Something went wrong :(

    Ups! Something went wrong :(

    I cloned the repo, build, installed and run and I'm only getting "Ups! Something went wrong :(". Is it possible to easily display something meaningful?

    opened by farmazon3000 2
  • network issues

    network issues

    Hi there, very interesting project, particularly the way you deal with the landscape/portrait stuff, it s transparent for the coder I have a question about the network issues (event hough I know there is no actual request..) for example in GetTvShowsInteractor class, we wait for some data received later on and then passed to the nofityTvShowsLoaded method. What if the context disappears meanwhile, like somebody killed the app, in your opinion, should'nt the callback object be a WeakReference?

    question 
    opened by sebastien-tiscar 2
  • BaseFragment onInjectDependencies called on method onAttach

    BaseFragment onInjectDependencies called on method onAttach

    Hola Pedro:

    He estado trasteando un poco el código de baseActivity y baseFragment y me parece que hay un pequeño bug cuando se restauran los fragments. Hay veces (cuando el activity y sus fragments son restaurados) en el que el fragment llama a onAttach antes de que el activity pase por onCreate (creo que solo se garantiza que el activity esté correctamente inicializado en el método onActivityCreated del fragment). En este caso, la clase BaseFragment llama a inject antes de que el grafo de Dagger esté correctamente inicializado provocando un NullPointerException.

    Posible solución: Llamar a injectDependencies (clase fragment que a su vez llama a inject del activity) en onActivityCreated y utilizar los objectos "injected" solo posteriormente a esta llamada.

    PD: Enhorabuena por el trabajo realizado.

    opened by alexmiragall 2
  • Trust anchor for certification path not found

    Trust anchor for certification path not found

    I have put my twitterConsumerKey and twitterConsumerSecret in fabric.properties file, but when i come to the logingactivity then click the login button, i got the error: com.twitter.sdk.android.core.TwitterApiException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. what is the problem? thanks for advance.

    opened by zkpeng 1
  • Crashed in Smartisan T1

    Crashed in Smartisan T1

    when i click item in the main view, it crashed. this is the error:

    26643-26643/com.github.pedrovgs.effectiveandroidui E/AndroidRuntime: FATAL EXCEPTION: main Process: com.github.pedrovgs.effectiveandroidui, PID: 26643 android.view.InflateException: Binary XML file line #7: Error inflating class at android.view.LayoutInflater.createView(LayoutInflater.java:620) at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56) at android.view.LayoutInflater.onCreateView(LayoutInflater.java:669) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:694) at android.view.LayoutInflater.rInflate(LayoutInflater.java:755) at android.view.LayoutInflater.inflate(LayoutInflater.java:492) at android.view.LayoutInflater.inflate(LayoutInflater.java:397) at com.github.pedrovgs.effectiveandroidui.ui.renderer.chapter.ChapterRenderer.inflate(ChapterRenderer.java:61) at com.pedrogomez.renderers.Renderer.onCreate(Renderer.java:52) at com.pedrogomez.renderers.RendererBuilder.createRenderer(RendererBuilder.java:143) at com.pedrogomez.renderers.RendererBuilder.build(RendererBuilder.java:115) at com.pedrogomez.renderers.RendererAdapter.getView(RendererAdapter.java:89) at android.widget.HeaderViewListAdapter.getView(HeaderViewListAdapter.java:220) at android.widget.AbsListView.obtainView(AbsListView.java:2377) at android.widget.ListView.makeAndAddView(ListView.java:1792) at android.widget.ListView.fillDown(ListView.java:693) at android.widget.ListView.fillFromTop(ListView.java:754) at android.widget.ListView.layoutChildren(ListView.java:1632) at android.widget.AbsListView.onLayout(AbsListView.java:2202) at android.view.View.layout(View.java:14845) at android.view.ViewGroup.layout(ViewGroup.java:4633) at com.github.pedrovgs.DraggableView.onLayout(DraggableView.java:433) at android.view.View.layout(View.java:14845) at android.view.ViewGroup.layout(ViewGroup.java:4633) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453) at android.widget.FrameLayout.onLayout(FrameLayout.java:388) at android.view.View.layout(View.java:14845) at android.view.ViewGroup.layout(ViewGroup.java:4633) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453) at android.widget.FrameLayout.onLayout(FrameLayout.java:388) at android.view.View.layout(View.java:14845) at android.view.ViewGroup.layout(ViewGroup.java:4633) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453) at android.widget.FrameLayout.onLayout(FrameLayout.java:388) at android.view.View.layout(View.java:14845) at android.view.ViewGroup.layout(ViewGroup.java:4633) at android.support.v7.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:437) at android.view.View.layout(View.java:14845) at android.view.ViewGroup.layout(ViewGroup.java:4633) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453) at android.widget.FrameLayout.onLayout(FrameLayout.java:388) at android.view.View.layout(View.java:14845) at android.view.ViewGroup.layout(ViewGroup.java:4633) at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525) at android.widget.LinearLayout.onLayout(LinearLayout.java:1434) at android.view.View.layout(View.java:14845) at android.view.ViewGroup.layout(ViewGroup.java:4633) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453) at android.widget.FrameLayout.onLayout(FrameLayout.java:388) at com.android.internal.policy.impl.PhoneWindow$DecorView.onLayout(PhoneWindow.java:2966) at android.view.View.layout(View.java:14845) at android.view.ViewGroup.layout(ViewGroup.java:4633) at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2070) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1810) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1065) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5790) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761) at android.view.Choreographer.doCallbacks(Choreographer.java:574) at android.view.Choreographer.doFrame(Choreographer.java:5

    Error occurred in the line 61 of the ChapterRenderer.class, this is the code: @Override protected View inflate(LayoutInflater layoutInflater, ViewGroup viewGroup) { return layoutInflater.inflate(R.layout.row_chapter, viewGroup, false); }

    i don't know why such a error occurred.

    bug 
    opened by wanyt 1
  • Add PMD and Findbugs check tools.

    Add PMD and Findbugs check tools.

    Hello @pedrovgs .

    This PR includes activation and usage of PMD and Findbugs plugins.

    It includes some changes to fit PMD requirements, and a couple of warnings disabled as an example. Your feedback will be very welcome.

    opened by vic-gonzi 1
  • fix bug for inheritance styles

    fix bug for inheritance styles

    this PR will fix bug for #16 && #17

    according to Styles and Themes

    Note: This technique for inheritance by chaining together names only works for styles defined by your own resources. You can't inherit Android built-in styles this way. To reference a built-in style, such as TextAppearance, you must use the parent attribute. hoping this PR will help you to fix these bugs,maybe have a better solution.FYI.

    opened by forever4313 1
  • Injected empty constructor

    Injected empty constructor

    You're telling Dagger to fill MainThreadImpl dependencies when it has no dependencies.

    By the way it's an interesting project!

    https://github.com/pedrovgs/EffectiveAndroidUI/blob/master/app/src/main/java/com/github/pedrovgs/effectiveandroidui/executor/MainThreadImpl.java#L32

    question 
    opened by ezebongiovi 1
  • Update: Navigator injected on TvShowCatalogPresenter

    Update: Navigator injected on TvShowCatalogPresenter

    Navigator is now injected into the TvShowCatalogFragmentPresenter. The presenter's method "onTvShowThumbnailClicked" is now using navigator to move the user into the corresponding tvshow details.

    All the navigation logic has been moved into the Navigator, even the fragment related one. The main problem here is that you need to make Navigator know everything about potentially available Fragments in the current injected Activity context.

    Aproach PR made for discussion!

    opened by JorgeCastilloPrz 1
  • Plugin with id 'sonar-runner' not found

    Plugin with id 'sonar-runner' not found

    When i try to build the app i get this :

    Error:(13, 0) Plugin with id 'sonar-runner' not found. <a href="openFile:C:\Users\Yunus\Documents\Android Architecture\AndroidUI\EffectiveAndroidUI\app\build.gradle">Open File</a>

    bug 
    opened by yunus89 4
  • fixed inflate exception occured in ChapterRenderer.java

    fixed inflate exception occured in ChapterRenderer.java

    The pull request fixes the exception:

    android.view.InflateException: Binary XML file line #32: Error inflating class <unknown>
                                                                                                at android.view.LayoutInflater.createView(LayoutInflater.java:620)
                                                                                                at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
                                                                                                at android.view.LayoutInflater.onCreateView(LayoutInflater.java:669)
                                                                                                at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:694)
                                                                                                at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
                                                                                                at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
                                                                                                at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
                                                                                                at com.github.pedrovgs.effectiveandroidui.ui.renderer.chapter.ChapterRenderer.inflate(ChapterRenderer.java:64)
    

    And the exception still occurs when I tested it in the Samsung GT-I8552. Although I fixed it, I don't know why. The exception occurred in ChapterRenderer.java:

    @Override protected View inflate(LayoutInflater layoutInflater, ViewGroup viewGroup) {
        return layoutInflater.inflate(R.layout.row_chapter, viewGroup, false);
      }
    

    I thought maybe row_chapter.xml causes the crash, and I created a file named row_chapter_2.xml. Then, I put the attribute copy from styles-chapter.xml to row_chapter_2.xml. like below:

    <TextView android:id="@+id/tv_chapter_number"
          android:layout_alignParentLeft="true"
          android:layout_centerVertical="true"
          style="@style/AppTheme.Chapter.Number"/>
    

    replaced by

    <TextView android:id="@+id/tv_chapter_number"
            android:layout_alignParentLeft="true"
            android:layout_centerVertical="true"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="@color/sixth_color"
            android:textSize="@dimen/numeric_title_size"
            android:layout_marginLeft="@dimen/secondary_margin"/>
    

    And the crash is solved. Do you know the reason?

    opened by wanyt 0
  • Crashing in samsung galaxy note 3 v4.3

    Crashing in samsung galaxy note 3 v4.3

    Part of error report:

    FATAL EXCEPTION: main
    android.view.InflateException: Binary XML file line #11: Error inflating class android.widget.TextView
        at android.view.LayoutInflater.createView(LayoutInflater.java:613)
                                                                                            at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
                                                                                            at android.view.LayoutInflater.onCreateView(LayoutInflater.java:660)
                                                                                            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:685)
                                                                                            at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
                                                                                            at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
                                                                                            at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
                                                                                            at com.github.pedrovgs.effectiveandroidui.ui.renderer.tvshow.TvShowRenderer.inflate(TvShowRenderer.java:66)
    

    Inflation error occurs in TvShowRenderer line 66 when inflating R.layout.row_tv_show

    bug 
    opened by gjnidea 2
  • Crashed in my MI4 phone

    Crashed in my MI4 phone

    the crash log: 01-15 11:57:23.631 11565-11565/? D/dalvikvm: Late-enabling CheckJNI 01-15 11:57:23.701 11565-11565/com.github.pedrovgs.effectiveandroidui W/dalvikvm: VFY: unable to find class referenced in signature (Landroid/view/SearchEvent;) 01-15 11:57:23.701 11565-11565/com.github.pedrovgs.effectiveandroidui I/dalvikvm: Could not find method android.view.Window$Callback.onSearchRequested, referenced from method android.support.v7.internal.view.WindowCallbackWrapper.onSearchRequested 01-15 11:57:23.701 11565-11565/com.github.pedrovgs.effectiveandroidui W/dalvikvm: VFY: unable to resolve interface method 14134: Landroid/view/Window$Callback;.onSearchRequested (Landroid/view/SearchEvent;)Z 01-15 11:57:23.701 11565-11565/com.github.pedrovgs.effectiveandroidui D/dalvikvm: VFY: replacing opcode 0x72 at 0x0002 01-15 11:57:23.701 11565-11565/com.github.pedrovgs.effectiveandroidui I/dalvikvm: Could not find method android.view.Window$Callback.onWindowStartingActionMode, referenced from method android.support.v7.internal.view.WindowCallbackWrapper.onWindowStartingActionMode 01-15 11:57:23.701 11565-11565/com.github.pedrovgs.effectiveandroidui W/dalvikvm: VFY: unable to resolve interface method 14138: Landroid/view/Window$Callback;.onWindowStartingActionMode (Landroid/view/ActionMode$Callback;I)Landroid/view/ActionMode; 01-15 11:57:23.701 11565-11565/com.github.pedrovgs.effectiveandroidui D/dalvikvm: VFY: replacing opcode 0x72 at 0x0002 01-15 11:57:23.741 11565-11565/com.github.pedrovgs.effectiveandroidui I/dalvikvm: Could not find method android.content.res.TypedArray.getChangingConfigurations, referenced from method android.support.v7.internal.widget.TintTypedArray.getChangingConfigurations 01-15 11:57:23.741 11565-11565/com.github.pedrovgs.effectiveandroidui W/dalvikvm: VFY: unable to resolve virtual method 421: Landroid/content/res/TypedArray;.getChangingConfigurations ()I 01-15 11:57:23.741 11565-11565/com.github.pedrovgs.effectiveandroidui D/dalvikvm: VFY: replacing opcode 0x6e at 0x0002 01-15 11:57:23.741 11565-11565/com.github.pedrovgs.effectiveandroidui I/dalvikvm: Could not find method android.content.res.TypedArray.getType, referenced from method android.support.v7.internal.widget.TintTypedArray.getType 01-15 11:57:23.741 11565-11565/com.github.pedrovgs.effectiveandroidui W/dalvikvm: VFY: unable to resolve virtual method 443: Landroid/content/res/TypedArray;.getType (I)I 01-15 11:57:23.741 11565-11565/com.github.pedrovgs.effectiveandroidui D/dalvikvm: VFY: replacing opcode 0x6e at 0x0002 01-15 11:57:23.801 11565-11565/com.github.pedrovgs.effectiveandroidui D/dalvikvm: GC_FOR_ALLOC freed 395K, 26% free 23039K/30732K, paused 15ms, total 15ms 01-15 11:57:23.811 11565-11565/com.github.pedrovgs.effectiveandroidui I/dalvikvm-heap: Grow heap (frag case) to 39.105MB for 9000016-byte allocation 01-15 11:57:23.871 11565-11565/com.github.pedrovgs.effectiveandroidui I/Adreno-EGL: <qeglDrvAPI_eglInitialize:410>: EGL 1.4 QUALCOMM build: YWEN_+PATCH[ES]_msm8974_refs/tags/AU_LINUX_ANDROID_LNX.LA.3.5.2.2.1_RB1.04.04.04.090.059__release_ENGG () OpenGL ES Shader Compiler Version: E031.24.00.15 Build Date: 11/04/15 Wed Local Branch: tip Remote Branch: quic/kk_3.5_1 Local Patches: 14b1eae272f4a5ed345b2294a1c76becd9b27371 rb: re-work change "ES2.0 Fix for shadow cached VBO validation" c63208cf6c1fe92a04d7ed7e26be44f2f51c94e9 Revert "Fix for perf regression from "ES2.0 Fix for shadow cached VBO validation"" 01-15 11:57:23.901 11565-11565/com.github.pedrovgs.effectiveandroidui D/OpenGLRenderer: Enabling debug mode 0 01-15 11:57:23.981 11565-11565/com.github.pedrovgs.effectiveandroidui I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@42d5f680 time:180624621 01-15 11:57:25.371 11565-11565/com.github.pedrovgs.effectiveandroidui D/AndroidRuntime: Shutting down VM 01-15 11:57:25.371 11565-11565/com.github.pedrovgs.effectiveandroidui W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x41755d58) 01-15 11:57:25.421 11565-11565/com.github.pedrovgs.effectiveandroidui E/AndroidRuntime: FATAL EXCEPTION: main Process: com.github.pedrovgs.effectiveandroidui, PID: 11565 android.view.InflateException: Binary XML file line #11: Error inflating class android.widget.TextView at android.view.LayoutInflater.createView(LayoutInflater.java:623) at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56) at android.view.LayoutInflater.onCreateView(LayoutInflater.java:672) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:697) at android.view.LayoutInflater.rInflate(LayoutInflater.java:758) at android.view.LayoutInflater.inflate(LayoutInflater.java:495) at android.view.LayoutInflater.inflate(LayoutInflater.java:400) at com.github.pedrovgs.effectiveandroidui.ui.renderer.tvshow.TvShowRenderer.inflate(TvShowRenderer.java:66) at com.pedrogomez.renderers.Renderer.onCreate(Renderer.java:52) at com.pedrogomez.renderers.RendererBuilder.createRenderer(RendererBuilder.java:143) at com.pedrogomez.renderers.RendererBuilder.build(RendererBuilder.java:115) at com.pedrogomez.renderers.RendererAdapter.getView(RendererAdapter.java:89) at android.widget.AbsListView.obtainView(AbsListView.java:2257) at android.widget.GridView.onMeasure(GridView.java:1044) at android.view.View.measure(View.java:16529) at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:719) at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:455) at android.view.View.measure(View.java:16529) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) at android.view.View.measure(View.java:16529) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) at android.support.v7.internal.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:124) at android.view.View.measure(View.java:16529) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) at android.support.v7.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:393) at android.view.View.measure(View.java:16529) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) at android.view.View.measure(View.java:16529) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404) at android.widget.LinearLayout.measureVertical(LinearLayout.java:695) at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) at android.view.View.measure(View.java:16529) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2291) at android.view.View.measure(View.java:16529) at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1973) at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1170) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1352) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1057) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5666) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761) at android.view.Choreographer.doCallbacks(Choreographer.java:574) at android.view.Choreographer.doFrame(Choreographer.java:544) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747) at android.os.Handler.handleCallback(Handler.java:733) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5072) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) at com.android.internal.os.ZygoteInit.main(ZygoteI 01-15 11:57:27.361 11565-11565/com.github.pedrovgs.effectiveandroidui I/Process: Sending signal. PID: 11565 SIG: 9

    bug 
    opened by JeffZane 3
Owner
Pedro Vicente Gómez Sánchez
"Sometimes it is the people no one imagines anything of who do the things no one can imagine." - Alan Turing
Pedro Vicente Gómez Sánchez
This project created just for help developer who want to and ability of read VISA, UNION PAY, HUMO, ATTO and some other cards data read.

If you enjoy my content, please consider supporting what I do. Thank you. By me a Coffee To get a Git project into your build: Step 1. Add the JitPack

Fozilbek Imomov 1 Oct 15, 2022
A MaterialChipSetWidget is used to hold multiple chipsets 🤩 and each chipset has multiple values. 🔖

A MaterialChipSetWidget is used to hold multiple chipsets ?? and each chipset has multiple values. ??

Justin George 38 Sep 21, 2022
Name UI states, navigate between them, remember where you've been.

Deprecated Flow had a good run and served us well, but new use is strongly discouraged. The app suite at Square that drove its creation is in the proc

Square 2.8k Dec 29, 2022
ExpandableSelector is an Android library created to show a list of Button/ImageButton widgets inside a animated container which can be collapsed or expanded.

ExpandableSelector ExpandableSelector is an Android library created to show a list of Button/ImageButton widgets inside a animated container which can

Karumi 699 Nov 19, 2022
This is a sample Android Studio project that shows the necessary code to create a note list widget, And it's an implementation of a lesson on the Pluralsight platform, but with some code improvements

NoteKeeper-Custom-Widgets This is a sample Android Studio project that shows the necessary code to create a note list widget, And it's an implementati

Ibrahim Mushtaha 3 Oct 29, 2022
Pull/Drawer/Layer View

CurtainView Like DrawerLayout , but can layer both horizontally and vertically . Download Add the library to your module's build.gradle: dependencies

null 167 Jan 8, 2022
A file/directory-picker for android. Implemented as a library project.

Note: avoid using as SD-card file picker on Kitkat+ In Kitkat or above, use Android's built-in file-picker instead. Google has restricted the ability

Jonas Kalderstam 711 Dec 27, 2022
A crypto currency wallet UI/UX template created using Android's jetpack compose.

CryptoWalletTemplate A crypto currency wallet UI/UX template created using Android's jetpack compose. High definition demo on youtube Youtube video de

prosper ekwerike 5 Feb 6, 2022
A backport of the SwitchPreference component that was introduced on Android 4 (ICS / level 14). This port works on Android 2.1+ (Eclair MR1 / level 7).

Android Switch Preference Backport A backport of the SwitchPreference component that was introduced on Android 4 (ICS / level 14). This port works on

Benoit Lubek 498 Dec 29, 2022
A backport of the Android 4.2 GlowPadView that works on the SDK on API levels 4+

GlowPadBackport A backport of the Android 4.2 GlowPadView that works on the SDK on API levels 4+. It is heavily based upon Google's own internal imple

Frakbot 246 Dec 9, 2022
A beautiful Android custom View that works similar to a range or seekbar. With animations.

ValueBar A beautiful Android custom View that works similar to a range or seekbar. Selection by gesture. With animations. Supporting API level 11+. De

Philipp Jahoda 147 Nov 20, 2022
Provides 9-patch based drop shadow for view elements. Works on API level 9 or later.

Material Shadow 9-Patch This library provides 9-patch based drop shadow for view elements. Works on API level 14 or later. Target platforms API level

Haruki Hasegawa 481 Dec 19, 2022
Aether - anti-aliased UI engine designed for Minecraft, and general LWJGL

README WIP SOME THINGS MIGHT BE INACCURATE Aether UI Aether is anti-aliased UI engine designed for Minecraft, and general LWJGL. It is compatible with

Prism Client 35 Nov 12, 2022
A new canvas drawing library for Android. Aims to be the Fabric.js for Android. Supports text, images, and hand/stylus drawing input. The library has a website and API docs, check it out

FabricView - A new canvas drawing library for Android. The library was born as part of a project in SD Hacks (www.sdhacks.io) on October 3rd. It is cu

Antwan Gaggi 1k Dec 13, 2022
Created a Tinder like Card Deck & Captain Train like Toolbar

TinderView Created A Simple and Beautiful Tinder like card deck & Captain Train like toolbar. This is heavily based on AndroidSwipeableCardStack, wenc

Aradh Pillai 328 Jun 18, 2022
NeoPOP was created with one simple goal; to create the next generation of a beautiful, affirmative design system

NeoPop is CRED's inbuilt library for using NeoPop components in your app

CRED 254 Dec 29, 2022
[Archived] Highlight the best bits of your app to users quickly, simply, and cool...ly

ShowcaseView The ShowcaseView (SCV) library is designed to highlight and showcase specific parts of apps to the user with a distinctive and attractive

Alex Curran 5.6k Dec 16, 2022
[] A simple way to "badge" any given Android view at runtime without having to cater for it in layout

Android ViewBadger A simple way to "badge" any given Android view at runtime without having to cater for it in layout. Note: If your aim is to replica

Jeff Gilfelt 3k Nov 28, 2022
Add some depth to your Android scrolling.

Parallax Pager Add some depth to your Android scrolling using the parallax effect! Installation Step 1. Add the JitPack repository to your build file

Prolific Interactive 782 Dec 29, 2022