Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Override layout xml from android framework

Problem

I want to override a layout file from android namespace, e.g. R.layout.popup_menu_item_layout (which is referenced from code as com.android.internal.R.layout.popup_menu_item_layout). By saying override, I assume declaring an xml file in the project which would be prioritized over the layout that framework owns.

Note, this is just an example layout, so the question concerns to each layout that's present in sdk/platforms/android-XX/data/res/layout directory.

What I've tried

tools:override

There's an undocumented tools:override tag available, which overrides specific resources. See this answer for an example, which overrides values from Design Support Library, not from Android framework.

Applying tools:override="true" to the root tag of the layout won't take effect.


XML layout references - refs.xml

As described in this post, declaring a refs.xml file in /values/ directory with following content:

<?xml version="1.0" encoding="utf-8"?> <resources>     <item type="layout" name="activity_main">@layout/activity_second</item> </resources> 

will refer to activity_second.xml once activity_main.xml is used. There's an answer that suggests using this technique in order to substitute Snackbar's layout.

This also won't take effect.

Question

Is there any legitimate way to override/substitute a layout file from android package?

like image 526
azizbekian Avatar asked Jun 16 '17 12:06

azizbekian


1 Answers

I know this is an old question but I also wanted to override a library layout with my own, here's how I did it.

The layout in question was called design_bottom_navigation_item

In refs.xml I added the following:

<resources xmlns:tools="http://schemas.android.com/tools">     <item name="design_bottom_navigation_item" type="layout" tools:override="true">@layout/bottom_navigation_item</item> </resources> 

There are 4 parts to this which I'll explain.

  • Name: This is the name of the layout you want to override
  • Type: The type of resource you are trying to override, in this case a layout.
  • tools:override: This is how you tell Android Studio to override the library layout with your own.
  • Value: This is where you specify what resource you want to use instead.

You can do this with any resource type this way.

like image 67
Scott Cooper Avatar answered Sep 23 '22 03:09

Scott Cooper