Android Studio: PNG on Button - android-studio

How can I set a png icon on a button in the MainActivity?
I have to change this icon many times during the program, so I can't set the image in the xml code.
But in the xml it is in the center of the button, so it's perfect and well stretched
android:drawableTop="#drawable/x"
In the MainActivity I don't know what to do
bt.setCompoundDrawablesWithIntrinsicBounds(null, x, null, null);

Use the below code:
Drawable top = getResources().getDrawable(R.drawable.x);
bt.setCompoundDrawablesWithIntrinsicBounds(null, top , null, null);
To Add the image at centre you can use imageButton:
Add the below image button in place of your button in layout xml.
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="#+id/imageButton" />
Get the imageButton and set drawable:
ImageButton ib = (ImageButton)findViewById(R.id.imageButton);
ib.setImageResource(R.drawable.x);
Hope this helps.

If you are targeting API level 17 or higher, you can accomplish this with just one simple line:
bt.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.x , 0, 0);
This method takes drawable resource ID's as arguments, so there is no need to get the drawable yourself using getDrawable(). Passing a 0 as argument means no icon on that side.
Good luck!

Related

Is it possible to create global objects in .NET MAUI

When I saw the TabBar and the Flyout menu in .NET Maui I started wondering if its possible to create your own global object for your application.
does anyone know how to do this?
(I want to add a status icon at the corner of my screen without having to manually add it to all pages.)
You can create a simple Floating Button and add it to your pages.
You can create an image with a transparent background in your favorite editor and then assign it a location on the Page.
You can refer to the following code:
<AbsoluteLayout>
<!--Other components-->
<ImageButton Source="icon.png"
BackgroundColor="Green"
CornerRadius="80"
AbsoluteLayout.LayoutFlags="PositionProportional"
AbsoluteLayout.LayoutBounds=".95,.95,80,80" />
</AbsoluteLayout>

How to get rid of the warning "cannot resolve symbole 'id/andr'" for ExpandableListView"

An app uses ExpandableListActivity, and the usage of ExpandableListView is standard based on the document:
<ExpandableListView
android:id="#id/android:list"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:divider="#android:color/transparent"
android:dividerHeight="5dip"
android:layout_marginTop="10dip">
</ExpandableListView>
Android Studio 3.2 has the following warning:
How can I get rid of the warning?
This is probably a typo. Change it to:
"#android:id/empty"
and
"#android:id/list"
See also https://developer.android.com/reference/android/app/ListActivity
ListActivity has a default layout that consists of a single,
full-screen list in the center of the screen. However, if you desire,
you can customize the screen layout by setting your own view layout
with setContentView() in onCreate(). To do this, your own view MUST
contain a ListView object with the id "#android:id/list" (or R.id.list
if it's in code)
I don't know what is ( id="#id/android:list")
give it an normal id ( #+id/androidlist )
and handle it in your code
but if you learn how to work with ExpandableListView
I prefer this link tutorial for you ExpandableListView Link
GL sir

how to get the bottom of a layout in android?

I'm using a relative layout in Android, and when adding a view to the bottom of the screen the view is placed lower than the actual bottom of the screen, where the user cant actualy see it.
view.setY(container.getBottom()-view.getHeight());
container.addView(view);
container is a RelativeLayout. i have also tried to use container.getHeight() which gave me the same result, and all the other solutions i found where using the xml file, which doesnt work for me since i need to add the view dynamically in a random position above the bottom of the screen, meaning
view.setY(container.getHeight()-Common.random.nextFloat()*100-view.getHieght());
this is the XML
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="#+id/layout"
tools:context="il.co.ovalley.dashvsponypolice.app.MainActivity">
</RelativeLayout>
and the View im trying to add:
public class GameView extends ImageView{
public GameView(RelativeLayout container) {
super(container.getContext());
m_container=container;
container.addView(this);
}
}
public class Cop extends GameView {
public Cop(RelativeLayout container) {
super(container);
m_isShooting=false;
m_LoadingTime=10;
m_isLoading=false;
m_xSpeed=1.5f;
setY(container.getHeight()-Common.random.nextFloat()*100-getHeight()/*-getPaddingBottom()*/);
float x=(Common.random.nextFloat()*m_container.getWidth());
setX(x);
drwableState=0;
changeDirection();
}
I have tested that on different versions of android and screen sizes and got the same result. so far, the only solution I found was subtracting an arbitrary int from the container's height which seems ok on one device and hope for the best for the others, I'm sure there is a better solution.
thnx
Why don't you just place the view at the bottom of the screen with ALIGN_PARENT_BOTTOM and then apply a random padding?
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
view.setPadding(0, 0, 0, randomValue); // left, top, right, bottom
container.addView(view, params);
All this calculating with the view.getHeight() is not good. Doing it like this works without you having to manage any of that yourself.

Android "tools" namespace in layout xml documentation

Per the question here,
What's "tools:context" in Android layout files?
The 'tools' namespace reference (xmlns:tools="http://schemas.android.com/tools") has begun to appear in my layouts recently, and I want to know more. The original post only described the 'tools:context' attribute, but I have also noticed usage of the "tools:listitem" attribute appearing when I have designated a preview layout item for a listview, i.e.
<ListView
android:id="#+id/lvCustomer"
tools:listitem="#layout/customer_list_item" >
</ListView>
Are there more elements?
What brought me to this 'tools' namespace is that I want to be able to have 'preview-only' text (i.e. in a TextView or EditText) when using the layout designer in eclipse.
Currently, I assign the 'text' or 'hint' property for previewing text when arranging my layouts... but then I always have to remember to clear the preview value from within the code.
Ideally, instead of
<string name="preview_customer_name">Billy Bob's Roadhouse Pub</string>
...
<TextView
android:id="#+id/tvCustomerName"
android:text="#string/preview_customer_name"
</TextView>
have a something like:
<TextView
android:id="#+id/tvCustomerName"
tools:previewText="#string/preview_customer_name"
</TextView>
Thanks-
We've just added support for designtime attributes like this in Android Studio 0.2.11. See http://tools.android.com/tips/layout-designtime-attributes for more.
Think of them as design time helpers only.They do not get processed in actual view rendering at run time.
For example you want to set background of some view in your layout design when working on android studio so that you can make clear distinction where that particular view is.So you would normally do that with
android:background="#color/<some-color>"
Now risk is that sometimes we forget to remove that color and it gets shipped in apk.
instead you can do as follows:
tools:background="#color/<some-color>"
These changes will be local to android studio and will never get transferred to apk.
And also check out http://tools.android.com/tech-docs/tools-attributes for more options.
You will find tool attribute when you set object in graphical layout.
Listview (in graphical mode) -> right Click -> Preview List Content -> Choose Layout...
produces:
tools:listitem="#layout/customer_list_item"
See in layout XML below. There are 2 namespace in use "xmlns:android" and "xmlns:tools".
Tools namespace is used when the developer wants to define placeholder content that is only used in preview or in design time. Tools namespace is removed when we compiled the app.
So in the code below, I want to show the placeholder image (image_empty) that will only be visible at design time, and image1 will the actual image that will be shown when the application launch

Monodroid: Programatically add custom controls to a layout with horizontal and vertical centering

I have an ImageView inside a RelativeLayout that I added programmatically (The ImageView is added by code, not the RelativeLayout.)
If I had added the ImageView by XML, I would have done this:
<ImageView
android:id="#+id/login_loadingimage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:src="#drawable/imagefilename"
android:visibility="invisible"
/>
But now I want this done programtically. How do I get the centering right? I have tried creating RelativeLaout.Parameters but whe I create them using
RelativeLayout.LayoutParams p = new RelativeLayout.LayoutParams(this, null); //[1]
p.AddRule(...);[2]
An exception is thrown at line 1. In addition I wouldn't know how to apply these LayoutParameters on ViewGroup.LayutParameters anyway.
Also, I cannot just make ViewGroup.LayoutParameters because
1. They do not seem to have the Centering (Horizontal and Vertical) elements I need.
2. Every example seems to indicate there is a Constructor that simply takes Layout_Width and Layout_Height as parameters, but there is not.
Before someone says to add a layout first, please tell me how to center the layout in code as well. Thanks.
Please help.
The way to do it is simple:
Create xaml you want of JUST the component - put the file in the layout folder.
Then use the inflating service to inflate the control inside the code you want (make sure to create the LayoutInflator as follows):
LayoutInflater _inflatorservice = (LayoutInflater)this.GetSystemService(Context.LayoutInflaterService);
Then simply call this:
_inflatorservice.Inflate(Resource.Layout.[control], parent);
and Bob is your mother's brother!

Resources