Gradle flavors, applicationId and not resolved custom view attributes - android-gradle-plugin

I have a custom view based on GridLayout:
package com.mycompany.myapp;
...
public class GridLayoutForceSizeCells extends GridLayout
{
}
I have defined an xml with custom attributes for this class:
<?xml version="1.0" encoding="utf-8" ?>
<resources>
<declare-styleable name="GridLayoutForceSizeCells">
<attr name="totalImages" format="integer" />
<attr name="desiredColumnCount" format="integer" />
<attr name="spacing" format="dimension" />
<attr name="autoGenerate" format="boolean" />
</declare-styleable>
</resources>
Then, I have a layout using this:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:wheel="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.mycompany.myapp.GridLayoutForceSizeCells
xmlns:grid="http://schemas.android.com/apk/res/com.mycompany.myapp"
android:padding="3dp"
android:id="#+id/cellsGrid"
android:layout_width="match_parent"
android:layout_height="match_parent"
grid:desiredColumnCount="20"
grid:totalImages="0"
grid:spacing="1dp"
android:orientation="horizontal"/>
</LinearLayout>
The problem I am encountering is that when I change applicationId through a gradle flavor custom attributes are not resolved. I have read in gradlew help that the application package is the one used for R when it is decoupled using gradlew applicationId entry. So, applicationId should not affect my custom attributes package. But when I set applicationId to anything different from com.mycompany.myapp an error arises claiming that attributes can't be resolved.
Has anybody found a solution to this?
Cheers.

Finally fix it using xmlns:grid="http://schemas.android.com/apk/res-auto" to let it resolve the package for me in the layout file instead of the full package name.

Related

2x NavHostFragments visible in LayoutInspector, but only 1 in my layouts

I have had this issue that seems kind of weird to me. When looking at my app through the Layout Inspector, I can see that my navHostFragment is nested inside itself for some reason:
However, here is what part of my layout file looks like:
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="#+id/activity_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="false"
tools:context=".core.MainActivity">
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:id="#+id/activity_coordinator_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.fragment.app.FragmentContainerView
android:id="#+id/navHostFragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
I do not inflate another navHostFragment in the fragment container view, so why is the navHostFragment duplicated in layout inspector? Is this somehow normal or is there a hidden navHostFragment being inflated somehow?
Well upon further testing it seems like this additional layer is generated when using <androidx.fragment.app.FragmentContainerView but isn't there when using the <fragment tag.
Since the FragmentContainerView is the recommended container, I assume the duplicate is unavoidable.
I do not know if this could be considered a bug in Fragments or if it is expected behavior.

emre1512 Noty RelativeLayout creation in Kotlin

I have a simple MainActivity with a simple main layout like this:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
... />
</androidx.constraintlayout.widget.ConstraintLayout>
I need to activate Noty on this activity. What I need to know is how to create RelativeLayout "yourLayout" in its simple exmple in Kotlin.
Noty.init(YourActivity.this, "Your warning message", yourLayout, Noty.WarningStyle.SIMPLE).show();
Thank you!
Add an android:id attribute to your ConstraintLayout tag:
android:id="#+id/root"
Now you can fetch a reference to that ConstraintLayout in code:
val root: ConstraintLayout = findViewById(R.id.root)
Noty.init(this#MainActivity, "Your warning message", root, Noty.WarningStyle.SIMPLE).show()

why RecyclerView doesn't work in android 9

Although everything works well in android 8 and lower, but my RecyclerView doesn't load anything in android 9.
because I used Picasso in my recyclerView Adapter, I added code bellow to my AndroidManifest but nothing changed:
android:usesCleartextTraffic="true"
this is my RecyclerView XML code which is located in a MotionLayout:
<LinearLayout
android:id="#+id/linearlayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#F6F6F6"
android:elevation="10dp"
android:orientation="horizontal">
<androidx.recyclerview.widget.RecyclerView
android:id="#+id/recycler_challenge"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
note that I have two recyclerView in my layout, the first one, works well
but the second one doesn't work!
Define a xml file, then add to your manifest
->> android:networkSecurityConfig="#xml/network_security_config"
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">secure.example.com</domain>
</domain-config>
</network-security-config>

Can the Android native CardView be used in Xamarin Forms XAML?

I've messed around as best I can but I can't find a way to embed the native xamarin.android CardView control within xamarin.forms xaml. Following is my code:
my namespaces
xmlns:androidWidget="clr-namespace:Android.Widget;assembly=Mono.Android;targetPlatform=Android"
xmlns:androidWidgetv7="clr-namespace:Android.Support.V7.Widget;assembly=Xamarin.Android.Support.v7.CardView;targetPlatform=Android"
xmlns:androidLocal="clr-namespace:MyApp.Droid;assembly=MyApp.Android;targetPlatform=Android"
My Xaml
<androidWidgetv7:CardView x:Arguments="{x:Static androidLocal:MainActivity.Instance}" View.HorizontalOptions="Center" View.WidthRequest="600" View.HeightRequest="300">
<androidWidget:TextView x:Arguments="{x:Static androidLocal:MainActivity.Instance}" Text="Simple Native Color Picker" TextSize="24" View.HorizontalOptions="Center"/>
</androidWidgetv7:CardView>
I get the following error
Exception is: XamlParseException - Position 32:18. Can not set the content of androidWidgetv7:CardView as it doesn't have a ContentPropertyAttribute
There are zero examples on the web showing how to do this. Anyone know?
You can't. but you can implement a similar version of it like how they did here.
you can find alternative versions here and here.
Don't expect to get android animations/touch gestures here.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_horizontal"
android:padding="5dp">
<android.support.v7.widget.CardView
android:layout_width="fill_parent"
android:layout_height="245dp"
android:layout_gravity="center_horizontal">
<TextView
android:text="Basic CardView"
android:layout_marginTop="0dp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:layout_centerVertical="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
</android.support.v7.widget.CardView>
</LinearLayout>

Adding android:layoutAnimation to a LinearLayout causes FC

I have the following XML in menu.xml, it's a LinearLayout that I need to animate, so I use the layoutAnimation property. Without this property the layout shows flawlesly, but with this property set I get a nasty forceclose and I don't understand why:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#drawable/bkgrnd"
android:layoutAnimation="#anim/menu_anim" <=== adding this results in FC
...etc...
anim/menu_anim.xml:
<?xml version="1.0" encoding="utf-8"?>
<set
xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<alpha
android:fromAlpha="0.0"
android:toAlpha="1.0"
android:duration="500">
</alpha>
</set>
Help please! Thanks!
You cant add an animation directly to a layout. you have to create one more xml file in your anim folder which points to the animation xml (menu_anim) as below.
<?xml version="1.0" encoding="utf-8"?>
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
android:delay="30%"
android:animation="#anim/menu_anim"
/>
lets call the above xml as anim_controller.xml
now in your linear layout use
android:layoutAnimation="#anim/anim_controller"