Can't remove padding from Activity Dialog - android-layout

I have an activity styled as a popup:
[Activity(Theme="#android:style/Theme.Dialog")]
public class GameOverPopup : Activity
But I'm always stuck with a white padding around my controls (ignore the black border, it's not part of the popup):
I've tried setting the padding, margin, etc. to 0dp but always have that extra space.
How can I remove it?
UPDATE:
So I've tried the following according to suggestions:
In Styles.xml:
<style name="PopupDialog" parent="android:style/Theme.Dialog">
<item name="android:padding">0dp</item>
</style>
And then in my Activity (in the OnCreate Override):
SetTheme(Resource.Style.PopupDialog);
Yet I still have the padding :(

As I recall, the auto-generated activities in Eclipse include the Android activity-wide margins by default. You might check to make sure you have removed these lines in your XML layout if you used the default template.
EDIT, to sum up some comments and avoid creating a discussion: it appears that the problem may be due to the default padding in the dialog box style. Try creating a style with that style as its parent, and manually set the padding/margins as needed: http://developer.android.com/guide/topics/ui/themes.html#DefiningStyles.

Got it!!
Problem is that I set the theme in code on the OnCreate AS WELL as an attribute to the activity. So I remove the code from OnCreate and put the following attribute in my popup Activity class:
[Activity(Theme = "#style/PopupDialog")]
public class GameOverPopup : Activity
And my Styles.xml is:
<style name="PopupDialog" parent="android:style/Theme.Dialog">
<item name="android:windowBackground">#null</item>
<item name="android:padding">0dp</item>
</style>

Related

I have this problems with the Android Studio

The preview isn't showing anything.
and also shows many errors
1.Failed to find style 'coordinatorLayoutStyle' in current theme Tip: Try to refresh the layout.
2.Missing styles. Is the correct theme chosen for this layout? Use the Theme combo box above the layout to choose a different layout, or fix the theme style references.
3.The following classes could not be instantiated:
- android.support.design.widget.CoordinatorLayout (Open Class, Show Exception, Clear Cache)
- android.support.design.widget.AppBarLayout (Open Class, Show Exception, Clear Cache)
Tip: Use View.isInEditMode() in your custom
views to skip code or show sample data when shown in the IDE. If this
is an unexpected error you can also try to build the project, then
manually refresh the layout. Exception Details
java.lang.ClassNotFoundException:
android.view.View$OnUnhandledKeyEventListener Copy stack to clipboard
This question is a possible duplicate of this question. Since, I cannot comment, here is the accepted answer to the question:
I solved this rendering problem by simply inserting this line into the application theme.
<style name="AppTheme.NoActionBar">
<item name="coordinatorLayoutStyle">#style/Widget.Design.CoordinatorLayout</item>
</style>

How to set the theme for the application, to avoid wrong color transitions?

Background
I'm developing a themes chooser feature in my "app manager" app, and I've succeeded setting the theme dynamically for each of the activities.
AGAIN : this is not about setting the theme for the activities. This actually works fine for me.
The problem
The acitivties are showing the correct theme, but the application itself, when launching the app, is showing the wrong one, no matter what I do.
This is a problem because when the user opens the app, he will see the background of the theme of the app, and only after a few moments the activity will be shown with the theme the user has chosen.
So, if the application has a white background, and the user has chosen a theme with a black background, the order will be:
Application shows a white background -> activity is starting and shows a black background.
In screenshots:
So this is wrong. In this case, I need it to show black-to-black background.
Only if the user has chosen a Holo-light based theme (which the app has by default), it works fine, as the color matches the one on the activity that is shown right when opening the app.
What I've tried
I had an idea of setting the app's theme to be empty of everything, hoping that no transition will be shown, using something like:
<application
...
android:theme="#android:style/Theme.Translucent.NoTitleBar" >
In fact, some people here suggested a similar solution.
This works, but it causes a bad experience, since on some devices it takes some time till the first activity is shown, and as such, there is a significant amount of time the user sees nothing at all, as if the app isn't being launched.
The question
How do I solve this?
I've already tried setting the theme in the class that extends from Application, but it doesn't do anything, no matter where in this class I call it.
A bit late, but this may be the answer. I discovered it by chance.
No entrance activity, no custom animations, no hacking. Simply an attribute in theme. Android buried this deep inside its resources.
Add the following attribute to your app theme:
<!--
~ From Theme.NoDisplay, this disables the empty preview window probably
~ with an incorrect theme.
-->
<item name="android:windowDisablePreview">true</item>
And your are done. Enjoy it!
Transparent application theme with fade-in animation
My original suggestion was to use a Transparent full screen application theme (no action bar).
Combined with that, I always suggest an alpha-animation to fade across from the application theme to the activity theme. This prevents jarring to the user when the action bar appears.
OP's code would remain almost identical, except for changing the manifest theme, and adding the alpha animation in your onCreate() method of some base activity class as in examples below:
manifest theme defined as:
android:theme="#android:style/Theme.Translucent.NoTitleBar"
base activity onCreate() method:
#Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// set your custom theme here before setting layout
super.setTheme(android.R.style.Theme_Holo_Light_DarkActionBar);
setContentView(R.layout.activity_main);
overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
}
basic fade in:
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000"
android:fromAlpha="0.0"
android:toAlpha="1.0" />
basic fade out (not really needed, but for completeness):
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000"
android:fromAlpha="1.0"
android:toAlpha="0.0" />
Of course the animation durations here are way longer than you'd put in production - they are long so you can see them in your development stages.
Update #1:
It has been noted subsequently in comments by #EmanuelMoecklin, #androiddeveloper that this was considered. It is also included in answer by dentex. However, as the OP states, the weakness particularly on older devices is that the user gets no feedback when they try to launch the app. It appears the app takes too long to launch.
On KitKat, this is not the case, since the status bar & soft-keys change from transparent to black, while the rest of the screen is still transparent.
Another take on this approach would be to use a full-screen black background as the application theme. This is what was done by Bitspin for Timely, who were bought by Google apparently on the basis of the stunning UI in that app. It seems this method is therefore quite acceptable in many cases.
Update #2:
In order to speed up the perception of the launch, an alternative to the plain black theme is to use a full-screen image with the app's logo in the centre - "splash screen" style. Again fading across to the activity once launched.
This is not possible for the transparent theme, using a transparent full-screen image. Android ignores the transparency of the image (or overlays the transparent image onto a black background). This was pointed out by OP in the comments.
We can either have a transparent theme without an image, or an opaque theme with an image (an interesting topic for another question perhaps).
A note on using Manifest aliases
Another suggestion by #sergio91pt is to use aliases for different activities in the manifest.
While this can be a useful technique in some circumstances, in this case it has some drawbacks:
Any HOME screen shortcut the user has created for the activity will stop working when the main launcher alias is changed i.e. each time the user changes themes.
Some devices / launchers are quite slow to activate & deactivate the different aliases. In my experience this can take seconds (Galaxy Nexus 4.1 iirc), during which time you either have no visible launch icon, or you have 2 icons.
Each possibly theme requires a different alias - this may prove cumbersome if there are many different themes.
To fix any flickering (action bar, title...) upon app's start, I have set into the manifest
android:theme="#android:style/Theme.NoTitleBar"
for both my main activities (a tab container and a settings activity, from where I switch the themes, based on holo dark and light)
If you use some "launcher activity" or "splash activity" apply Theme.NoTitleBar also for them, then:
having declared Theme.NoTitleBar, for each activity, in onCreate you have to:
set the title properly with setTitle(...) and THEN
set the theme with setTheme(R.style.CustomAppTheme) BEFORE setContentView(...)
(and you already do this);
This will prevent the flashing of the action bar/title when switching theme (if done "on-the-fly") and upon app's start.
If you want a custom action bar appearance, this means that the default holo action bar will not flash before yours.
The transition color is retrieved from the activity theme on the manifest (or the application if not set).
Currently the only way around this limitation is to create a dummy subclass for each real Activity, eg. MyActivityLight, to declare a different theme. Activity alias won't work, the attribute will be ignored.
For activities with IntentFilter's, you should only maintain one of each "type" enabled, using PackageManager#setComponentEnabledSetting(). Note that the change may take some seconds.
For activities that are started by class name, you can infer the correct prefix according to the user's theme.
So lets suppose you have 2 themes: AppTheme.Dark and AppTheme.Light and some activities.
The dark theme is the default one.
Original manifest:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example">
<application android:theme="#style/AppTheme.Dark">
<activity
android:name=".PrivateActivity"
android:exported="false" />
<activity android:name=".ShowActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
</activity>
</application>
</manifest>
Change all activities above as abstract classes and create dummy subclasses suffixed by Light and Dark.
Then the manifest should be changed like this:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example">
<!-- No application theme -->
<application>
<activity android:name=".PrivateActivityDark"
android:theme="#style/AppTheme.Dark"
android:exported="false" />
<activity android:name=".PrivateActivityLight"
android:theme="#style/AppTheme.Light"
android:exported="false"
android:enabled="false" />
<activity
android:name=".ShowActivityDark"
android:theme="#style/AppTheme.Dark">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
</activity>
<activity
android:name=".ShowActivityLight"
android:enabled="false"
android:theme="#style/AppTheme.Light">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
</activity>
</application>
</manifest>
Then you could have something like this to get the themed Activity class, given an abstract Activity:
public static ComponentName getThemedActivityName(
Context ctx,
Class<? extends Activity> clazz) {
// Probably gets some value off SharedPreferences
boolean darkTheme = isUsingDarkTheme(ctx);
String baseName = clazz.getName();
String name += (darkTheme) ? "Dark" : "Light";
return new ComponentName(ctx, name);
}
public static void startThemedActivity(
Activity ctx,
Class<? extends Activity> clazz) {
Intent intent = new Intent();
intent.setComponent(getThemedActivityName(ctx, clazz));
ctx.startActivity(intent);
}
And also change the enabled status where needed, when the theme is changed.
public void onThemeChanged(Context ctx, boolean dark) {
// save theme to SharedPreferences or similar and...
final PackageManager pm = ctx.getPackageManager();
final String pckgName = ctx.getPackageName();
final PackageInfo pckgInfo;
try {
final int flags = PackageManager.GET_ACTIVITIES
| PackageManager.GET_DISABLED_COMPONENTS;
pckgInfo = pm.getPackageInfo(pckgName, flags);
} catch (PackageManager.NameNotFoundException e) {
throw new RuntimeException(e);
}
final ActivityInfo[] activities = pckgInfo.activities;
for (ActivityInfo info: activities) {
final boolean enable;
if (info.theme == R.style.AppTheme_Light) {
enable = !dark;
} else if (info.theme == R.style.AppTheme_Dark) {
enable = dark;
} else {
continue;
}
final int state = (enable) ?
PackageManager.COMPONENT_ENABLED_STATE_ENABLED :
PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
final String name = info.targetActivity;
final ComponentName cmp = new ComponentName(pckgName, name);
pm.setComponentEnabledSetting(cmp, state, PackageManager.DONT_KILL_APP);
}
}
If doing IPC on a loop scares you, you can do this asynchronously on a helper thread, as long as multiple calls to onThemeChanged() run sequentially.
Note that in this example I change the enabled status of all activities (that have a known theme) but only had to do that for the ones with intent filters. If the activities aren't hardcoded its easier this way.
Important Note: As Richard Le Mesurier and other have pointed out, using this technique on Launcher Activities removes or disables the shortcut on the home screen, if it exists. This is just a solution for non launcher Activities.

ActionBarSherlock - Action Items in menu overlapped by 'three dots button'

Today, I'm fighting a pretty ugly bug.
I want to put some items into bottom menu (not using tabs), but I want that these items only have defined "Title" and not "Icon". Everything works on devices with Android <= ICS. Widths of menu items are calculated correctly (I'd like to use "always" attribute for first three items, others use "ifRoom").
When I start the app on JB device, the last of these menu items is overlaped by "three dots button" hiding other four menu items.
I've tested this on HW Ascend G300 (ICS, hw menu button disabled), where the result was correct. On HTC X (JB), the result was incorrect.
Ps: when I set icon of first menu item (action_menu_map), everything works (I don't want to set it, of course).
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="#+id/action_menu_map"
android:showAsAction="always"
android:title="#string/ab_map"/>
<item
android:id="#+id/action_menu_list"
android:title="#string/ab_list"
android:showAsAction="always"/>
<item
android:id="#+id/action_menu_routes"
android:title="#string/ab_routes"
android:showAsAction="always"/>
<item
android:id="#+id/action_menu_call"
android:title="#string/ab_call"
android:icon="#drawable/call_icon"
android:showAsAction="ifRoom"/>
<item
android:id="#+id/action_menu_report_event"
android:title="#string/ab_report_event"
android:icon="#drawable/message_icon"
android:showAsAction="ifRoom"/>
<item
android:id="#+id/action_menu_settings"
android:title="#string/ab_settings"
android:showAsAction="ifRoom"/>
<item
android:id="#+id/action_menu_info"
android:title="#string/ab_info"
android:showAsAction="ifRoom"/>
</menu>
Thanks ;)
I had this three dots problem appearing at the bottom and it was only appearing at the bottom of HTC devices only (Sorry, I might be wrong about this but this is what I found). So, at last I changed the Project Build Target with the API level of 18 or I set android:targetSdkVersion="18" in my manifest file and the three buttons disappeared.
Use this
SHOW_AS_ACTION_IF_ROOM
Using this, if your actionbar does not have enough space to keep more items then it would go inside vertical 3 dots.
e.g.
menu.add("More").setOnMenuItemClickListener(this.DebugButtonHandler)
.setIcon(R.drawable.info).setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);

Android - tablet to phone screensize

I have an app that has a screen like this (on a 10" tablet) :
Now I need to amend the app to also work on a phone. As the screens will be smaller, I want to take the "split view" UI and change it so that the left hand side list view is shown on its own, then on selecting a row the appropriate right hand side list view is then shown.
How do I handle this in the app, as one activity currently handles both listviews, and I guess the phone will need two one for each listview.
How do I detect which one to do?
thanks
See Supporting Different Screen Sizes.
Typically this is done using Fragments, but the basic idea is the same whether you use fragments or not. You create two different layouts for your Activity depending on the screen size.
Save the default layout single-pane for phones at res/layout/activity_main.xml
Save the dual-pane tablet layout at res/layout/activity_main_twopane.xml
Then you use layout alias files with the screen size qualifiers described in the link to determine when the tablet layout should be used. For example to show the dual-pane layout on large screens and on screens with at least 600dp in the widest direction (includes large screen phones such as the Galaxy S3), you could do this:
res/values-large/layout.xml contains:
<resources>
<item name="activity_main" type="layout">#layout/activity_main_twopane</item>
<bool name="twopane">true</bool>
</resources>
res/values-sw600dp/layout.xml contains:
<resources>
<item name="activity_main" type="layout">#layout/activity_main_twopane</item>
<bool name="twopane">true</bool>
</resources>
The Android system will take care of loading the proper layout file (either res/layout/activity_main.xml or res/layout/activity_main_twopane.xml) when your Activity loads the layout:
setContentView(R.layout.activity_main);
Just remember that the views that don't exist in the single-pane layout will be null when you try to access them (e.g., there won't be two ListViews anymore). Checking whether a certain View exists is one way to detect which layout you are using.
Also note the use of optional Boolean resources in XML files. This is a handy way to pass the "is it a large screen or small screen" variable to your Java code. You can access Boolean resources in your Activity like this:
boolean isTwoPane = getResources().getBoolean(R.bool.twopane);
You should have a look at the MasterDetailedFlow Navigation template. Eclipse:NewProject>check create Activity>select "MasterDetailedFlow" Navigatoin type. Have a look at Data Binding on Android

Dynamic tab width in a Flex 4 TabBar component with skin

I have a Flex 4 TabBar component with a custom skin. In this skin, the item renderer is defined with an ButtonBarButton with a custom skin.
All the tabs in the itemrenderer have now the same width.
The client however wants me to make the tabs width dynamically, so a smaller tab for a smaller label, a bigger one for a long label.
Does anybody know how to adjust the width of Tab (ButtonBarButton)?
Thanks a million!
I found something that works.
Create a custom component that inherits from ButtonBarButton, call it CustomTabButton.
Add a bindable property tabWidth.
Then when we update tabWidth, the width of the tab is adjusted with it.
THis is how you update the skin:
set the host component to the custom class CustomTabButton.
In the SparkSkin definition, bind the width value to the hostComponents property tabWidth.
width="{hostComponent.tabWidth}"
The skin looks like this:
<s:SparkSkin xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:fb="http://ns.adobe.com/flashbuilder/2009"
minHeight="54"
width="{hostComponent.tabWidth}"
xmlns:tabbar="be.boulevart.project.components.tabbar.*">
<!-- host component -->
<fx:Metadata>
<![CDATA[
[HostComponent("be.boulevart.project.components.tabbar.CustomTabButton")]
]]>
</fx:Metadata>

Resources