How do I add settings to the SharedPreferences or Settings menu? - Android Q&A, Help & Troubleshooting

I want to know how to add something to the settings menu in my application. Or if using JellyBean or ICS how to use the button on the right bottom?
I haven't found anything on this topic yet. Can someone give me a tutorial or example? My application is pretty much finished, this is the only thing I am stuck at .
I noticed that:
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
Click to expand...
Click to collapse
So I went to menu/main.xml
That creates that menu with Settings that leads to no page yet.
How do I open or create a settings page? Do I need to create a new activity and use onClick listener ?

Have you tried developer.android.com? Take a look here http://developer.android.com/guide/topics/ui/menus.html
Sent from a Toasted Devil

Related

Need Some Help With Layout/Programming?

Hi all,
Some of you might know I'm currently working my NubDial (http://forum.xda-developers.com/showthread.php?t=629032) during my free time. However, I've run into a bug that I'm quite lost at.
Basically, whenever I long-press the "Menu" button to get the virtual keyboard to display, it messes up my layout. When I press "Back" or long press "Menu" again to hide the virtual keyboard, my layout remains messed up until I exit the app. See attached files for what I'm saying.
My source code is available here: http://code.google.com/p/nubdial
Any help would be greatly appreciated, thank you!
Update:
Anyone knows how to launch Call log and Favourites using Intent?
The following:
Code:
public Intent getCallLogIntent() {
Intent i = new Intent();
i.setAction(Intent.ACTION_VIEW);
i.setData(android.provider.CallLog.CONTENT_URI);
return i;
}
Works but it launches Dialer instead of Call log -_-. Thanks!
Are you trying to have the android keyboard cover the dialpad or just trying to figure out how to keep the layout from staying messed up after you close the android keyboard?
Only looked for a minute and I'm sure you've tried a lot of things but as for the alignment if you look in finger-layout>main.xml, in the RelativeLayout tag, have you tried changing the android:gravity so that the child table is "prepositioned" if you know what I mean?
JoshHart: I would love to have the keyboard simply cover the layout (similar to default Dialer). Any tips? Thanks for the help!
I'll check out the prepositioned thing later, out now.
On a different note, anyone knows how to launch Call log or Favourites using intent? Thanks
Wysie said:
On a different note, anyone knows how to launch Call log or Favourites using intent? Thanks
Click to expand...
Click to collapse
This seems to work on my Nexus:
Code:
Intent i = new Intent(Intent.ACTION_VIEW);
i.setClassName("com.android.contacts", "com.android.contacts.DialtactsActivity");
i.setType("vnd.android.cursor.dir/calls");
//i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
this.startActivity(i);
Don't know for favorites though, a variation of type might do it, but neither "starred" nor "favorites" worked for me.
illojal: Thanks but I already did that and it worked ! Yeah Favourites is kinda weird.

[APP] Start / Stop Sense

This is 2 really simple apps and it creates 2 shortcuts off the start menu to them.
One to Stop Sense and the other to Start Sense.
(It does not do anything with any other Today Item. Titanium is a Today Item. It will not stop or start Titanium.)
Purpose - Stop Sense does exactly that, which makes more memory available. I see 110 MB available when Sense is not running. I start Sense, and there is 75 MB available. Sense will continue to eat up more memory as you use different tabs. Stopping it and starting it will return alot of this memory.
I attached the source code to post #2.
Icons by Lechux posted here: http://forum.xda-developers.com/showpost.php?p=5887883&postcount=1 as the Firestorm Iconset.
Pointed out to me by Joe Bleau posted here: http://forum.xda-developers.com/showpost.php?p=11197629&postcount=32967
where he gave proper reference to the original and made a 2nd one with the other color.
This app is very simple, but if you find it useful, please thank the post.
Source Code
Attached here is the entire project with source code to build it.
Things that can be learned from the source code
How to use functions defined in core.dll.
How to use PostMessage.
How to write to the registry.
How to write an app with no user interface.
How to create a cab
How to include multiple targets in 1 cab.
If you learn something from this, or find it useful, please thank the post.
File where all the work is done SenseState.cs:
Code:
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using Microsoft.Win32;
namespace StopSense_JVH3
{
class SenseState
{
[DllImport("coredll.dll")]
private static extern int SendMessage(IntPtr hWnd, uint msg, int wParam, int lParam);
[DllImport("coredll.dll")]
private static extern bool PostMessage(IntPtr hWnd, uint msg, int wParam, int lParam);
public const int HWND_BROADCAST = 0xffff;
public const int WM_WININICHANGE = 0x001A;
public static void StartSense()
{
try
{
RegistryKey RegKey = Registry.LocalMachine.OpenSubKey(@"Software\Microsoft\Today\Items\HTC Sense", true);
if (RegKey != null)
{
RegKey.SetValue("Enabled", 1);
RegKey.Close();
}
PostMessage((IntPtr)HWND_BROADCAST, WM_WININICHANGE, 0xF2, 0);
}
catch (Exception someEx)
{
string s = someEx.Message;
int i = 0;
i++;
}
}
public static void StopSense()
{
try
{
RegistryKey RegKey = Registry.LocalMachine.OpenSubKey(@"Software\Microsoft\Today\Items\HTC Sense", true);
if (RegKey != null)
{
RegKey.SetValue("Enabled", 0);
RegKey.Close();
}
PostMessage((IntPtr)HWND_BROADCAST, WM_WININICHANGE, 0xF2, 0);
}
catch (Exception someEx)
{
string s = someEx.Message;
int i = 0;
i++;
}
}
}
}
Then it is called in Program.cs
Code:
using System;
using System.Collections.Generic;
using System.Text;
namespace StopSense_JVH3
{
class Program
{
static void Main(string[] args)
{
SenseState.StopSense();
}
}
}
Thanks. Would it be hard to add a reset shortcut too?
Reserving Post
Just in case, but the app is so simple I can't imaging a need for this yet.
mwalt2 said:
Thanks. Would it be hard to add a reset shortcut too?
Click to expand...
Click to collapse
There is already a reset shortcut to reset the phone.
And a Sense Reset also already exists.
JVH3 said:
There is already a reset shortcut to reset the phone.
And a Sense Reset also already exists.
Click to expand...
Click to collapse
I know it already exists. I was just thinking it could be an all-in-one solution (start, stop, reset).
Frozen on NRG Splash Screen
I'm sorry to report that I have a spare Titlt 2 that I hard resetted this afternoon to make default Home screen captures for your app, running Energy.RHODIUM.28244.Sense2.5.Cookie.2.0.Feb.01 w/o any mods nor apps except Whip2Snap to make screen captures and w/o SIM.
I installed StartStopSense_JVH3_v1001.CAB while I was in Titanium mode (Sense stopped) & when I clicked on Start Sense, nothing was happening. I restarted the phone for good measure, same results. I then started Sense via Start > Settings > Home > Items and then tried Stop Sense. The phone froze on the splash screen before normally Starting Sense text appears. I soft resetted twice and both times I got: Mainsplash > animation > NRG/HTC Quietly Brilliant > No SIM warning & black dialer (emergency calls only) & after waiting a while, pressing End brings me to the same NRG splash (see screen capture below), never getting to Home. The End hardware button does not bring up Home.
Only Start works but Start > Home does not work. Start > Settings > Remove program StartStopSense_JVH3_v1001.CAB worked but still no Home!
Soft reset: still no Home, stuck on NRG's splash screen and End hardware button does not bring up Home. Only solution I could think of is to hard reset.
If you want to try StartStopSense_JVH3_v1001.CAB, I strongly suggest that you backup your settings & data first.
Edit: Start > Whip2Snap worked so I took this screen capture before hard resetting:
Hard reset was not necessary / source code and full project is in post #2
Joe Bleau said:
I'm sorry to report that I have a spare Titlt 2 that I hard resetted this afternoon to make default Home screen captures for your app, running Energy.RHODIUM.28244.Sense2.5.Cookie.2.0.Feb.01 w/o any mods nor apps except Whip2Snap to make screen captures and w/o SIM.
I installed StartStopSense_JVH3_v1001.CAB while I was in Titanium mode (Sense stopped) & when I clicked on Start Sense, nothing was happening. I restarted the phone for good measure, same results. I then started Sense via Start > Settings > Home > Items and then tried Stop Sense. The phone froze on the splash screen before normally Starting Sense text appears. I soft resetted twice and both times I got: Mainsplash > animation > NRG/HTC Quietly Brilliant > No SIM warning & black dialer (emergency calls only) & after waiting a while, pressing End brings me to the same NRG splash (see screen capture below), never getting to Home. The End hardware button does not bring up Home.
Only Start works but Start > Home does not work. Start > Settings > Remove program StartStopSense_JVH3_v1001.CAB worked but still no Home!
Soft reset: still no Home, stuck on NRG's splash screen and End hardware button does not bring up Home. Only solution I could think of is to hard reset.
If you want to try StartStopSense_JVH3_v1001.CAB, I strongly suggest that you backup your settings & data first.
Edit: Start > Whip2Snap worked so I took this screen capture before hard resetting:
Click to expand...
Click to collapse
The app only stops sense and starts sense.
It does not stop Titanium (Windows Default) and it does not start Titanium.
I have stopped and started sense several times with it.
You realy didn't need to hard reset. I published the source code in post #2.
You can see that all running it does is modify 1 registry entry. Then sends a message using PostMessage so that windows will be notified of the change.
If you would have just used Start->Settings->Today->Items and selected the option that you wanted, you would have been able to correct anything without a hard reset.
Or to just have run Start Sense.
Titanium (Windows Default) is a today plugin. The app does not toggle between Titanium and Sense, it only stops sense and starts sense.
The image you posted is almost exactly what I see when I stop sense.
Then I use the Start Sense app to start sense, and Sense Starts.
Start Sense is not designed to stop any other today items, such as Windows Default, before starting sense.
Idea for new version
Make it more general
New version should be renamed to Stop Today Items / Start Today Items / Start Sense / Start Titanium
Stop Today Items (Biggest Memory Savor)
Stop all today items, such as Sense or Titanium or any others, recording which ones it stopped.
Start Today Items
Stop any running today items.
Start all today items that Stop Today Items had stopped.
Start Sense
Stop all today items. Start Sense.
start Titanium (Saves memory, but it is a today item, so it does consume some.)
Stop all today items. Start Titanium (Windows Default).
I'll need some more icons. Please post pngs.
Start & Stop Sense
I want to thank you JVH3, for your support.
Even being apparently simple, as you wrote, for me it was a pain going all the way through menus to start and stop sense everytime I wanted to play a movie or use GPS.
People like you, Joe Bleau and others, not forgeting NRGZ28, that support this development are the ones that will keep this excelent smartphone alive for a long time.
I have waited a long time to dive into this ROM. I could not afford having issues with my work tool.
I have been following this thread for quite some time and could see all the effort you all put into it.
Last week, reading the posts, I figured out that it was stable enough to flash it in my TP2.
And it really is amazing.
The only issue I had so far is a screen freezing (the phone keeps receiveing calls) when I go inside some configuration menus, like sounds. But I only do that on my spare time.
I did not use TASK29 (I didn´t understand how to use it) I had the original WWE stock ROM that came with it from htc. I bought an unlocked TP2 from Amazon.
Probably when I wipe it all with Task29 this issue disappears. I haven´t read any report with an issue like that.
I´ll keep you posted when I do that.
Thanks again
costinhas.
Brazil.
Possible problem?
Here is all that I did today which led me to my problem:
1. Switched from Panel start menu to Normal start menu
2. Installed MMAppLauncher from here
3. Selected override start menu option in the app above
4. Installed StartStopSense app
Sense is stopped just fine. But when I try to restart it, I get the never ending loop of "Tap here to launch..." and "Launching HTC Sense." A search reveals that this problem might be a common one across different situations. What I don't know is whether its the MMAppLauncher or StartStopSense that is the possible culprit.
Any ideas?
bipinsen said:
Here is all that I did today which led me to my problem:
1. Switched from Panel start menu to Normal start menu
2. Installed MMAppLauncher from here
3. Selected override start menu option in the app above
4. Installed StartStopSense app
Sense is stopped just fine. But when I try to restart it, I get the never ending loop of "Tap here to launch..." and "Launching HTC Sense." A search reveals that this problem might be a common one across different situations. What I don't know is whether its the MMAppLauncher or StartStopSense that is the possible culprit.
Any ideas?
Click to expand...
Click to collapse
This app is not responsible for any sense restart loop.
My guess is that you are using Cookie 2.0 and have the Task widget on your homescreen, but no tasks to display. It's a common problem with Cookie 2.0.
Common fix found in that thread is to:
Stop Sense
add a task through the windows interface to tasks. With an energy ROM: Action->Task
Start Sense
--------------------------------------------
Literally, these app (Start Sense / Stop Sense ) change 1 registry entry when run.
Start Sense does this
[HKLM\Software\Microsoft\Today\Items\HTC Sense]
Enabled=1
Stop Sense does this
[HKLM\Software\Microsoft\Today\Items\HTC Sense]
Enabled=0
After that, each apps does this:
PostMessage((IntPtr)HWND_BROADCAST, WM_WININICHANGE, 0xF2, 0);
That just tells the operating system that something changed. The operating system is responsible for everything beyond that.
Code:
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using Microsoft.Win32;
namespace StopSense_JVH3
{
class SenseState
{
[DllImport("coredll.dll")]
private static extern int SendMessage(IntPtr hWnd, uint msg, int wParam, int lParam);
[DllImport("coredll.dll")]
private static extern bool PostMessage(IntPtr hWnd, uint msg, int wParam, int lParam);
public const int HWND_BROADCAST = 0xffff;
public const int WM_WININICHANGE = 0x001A;
public static void StartSense()
{
try
{
RegistryKey RegKey = Registry.LocalMachine.OpenSubKey(@"Software\Microsoft\Today\Items\HTC Sense", true);
if (RegKey != null)
{
RegKey.SetValue("Enabled", 1);
RegKey.Close();
}
PostMessage((IntPtr)HWND_BROADCAST, WM_WININICHANGE, 0xF2, 0);
}
catch (Exception someEx)
{
string s = someEx.Message;
int i = 0;
i++;
}
}
public static void StopSense()
{
try
{
RegistryKey RegKey = Registry.LocalMachine.OpenSubKey(@"Software\Microsoft\Today\Items\HTC Sense", true);
if (RegKey != null)
{
RegKey.SetValue("Enabled", 0);
RegKey.Close();
}
PostMessage((IntPtr)HWND_BROADCAST, WM_WININICHANGE, 0xF2, 0);
}
catch (Exception someEx)
{
string s = someEx.Message;
int i = 0;
i++;
}
}
}
}
JVH3 said:
This app is not responsible for any sense restart loop.
My guess is that you are using Cookie 2.0 and have the Task widget on your homescreen, but no tasks to display. It's a common problem with Cookie 2.0.
Common fix found in that thread is to:
Stop Sense
add a task through the windows interface to tasks. With an energy ROM: Action->Task
Start Sense
--------------------------------------------
Literally, these app (Start Sense / Stop Sense ) change 1 registry entry when run.
Start Sense does this
[HKLM\Software\Microsoft\Today\Items\HTC Sense]
Enabled=1
Stop Sense does this
[HKLM\Software\Microsoft\Today\Items\HTC Sense]
Enabled=0
Click to expand...
Click to collapse
I do have Cookie 2.0, but no Task widgets. A simple soft reset brings Sense back to life. Strange. But thanks for the explanation on what the app does.
Re: What Start/Stop Sense Does
JVH3 said:
The app only stops sense and starts sense.
It does not stop Titanium (Windows Default) and it does not start Titanium...
Click to expand...
Click to collapse
Sorry, I thought the app was for Sense <---> Windows default, hence the icons I suggested in the other thread:
***
Thanks for your reply with details.
Joe Bleau said:
Sorry, I thought the app was for Sense <---> Windows default, hence the icons I suggested in the other thread:
***
Thanks for your reply with details.
Click to expand...
Click to collapse
That was one of the reasons that I went with the other 2 icons.
I have updated post #1 with a little more info, so that no one else will misunderstand.
Next Version Idea
Instead of my previous idea of 4 apps, just 3.
Sense
Titanium
Stop Today Items
I am thinking that number of users that are using Today items other than Sense or Titanium is too small to be concerned with. I don't use them, so I don't have any real motivation to support other today items.
So, unless a hefty donation comes my way requesting support of other today items besides Sense, Titanium, and None, I am not planning to support them.
This gives the ability to switch between them easily and also no today items for maximum available memory.
Sense would stop all today items and then Start Sense
Titanium would stop all today items and then Start Titanium
Stop Today Items would stop all today items.
I am open to names and suggestions.
Maybe Go Sense, Go Titanium, Today Items Off
Or Start Sense, Start Titanium, Stop Today Items
I am a programmer. Names would be deferred to sales marketing where I work, so please post ideas and pngs.
Thinking the current Start Sense icon works, but I would need a similar Titanium and maybe a cross between Titanium and Sense with the red circle.
Anyone with Art or photoshop talent, please post.
128x128 png is the prefered format.
Also, icons can not have muliple levels of transparancy. Either transparent or solid. No translucent.
Name Idea
SST
Stop (or Start) Sense Titanium, (also) Stop (or Start) Some Today's, (plus) Stop Start Today
Another name could be Today All, or Today Terminator. LoL
SST is a lil more universal for what it could stand for and describe as doing.

Reordering a List

Trying to reorder a list. I have a layout with up arrow image on left, textview in middle and down arrow on right. XML sets images to invisible.
On list item press, I turn the arrows to visible FOR THAT ITEM. Based on up or down, I swap the list item and call myAdapter.notifyDataSetChanged() in which I set both image arrows to invisible. Works just fine, except...
The client wants the arrows to "follow" the list item till a "Done" button is pressed.
I'm having trouble wrapping my head around how I get the arrows to be visible on list item pressed +/- 1...any ideas?
Tia,
Roots
P.S. The app has a database where I store these changes vs. the volatile nature of the list views
Rootstonian said:
Trying to reorder a list. I have a layout with up arrow image on left, textview in middle and down arrow on right. XML sets images to invisible.
On list item press, I turn the arrows to visible FOR THAT ITEM. Based on up or down, I swap the list item and call myAdapter.notifyDataSetChanged() in which I set both image arrows to invisible. Works just fine, except...
The client wants the arrows to "follow" the list item till a "Done" button is pressed.
I'm having trouble wrapping my head around how I get the arrows to be visible on list item pressed +/- 1...any ideas?
Tia,
Roots
P.S. The app has a database where I store these changes vs. the volatile nature of the list views
Click to expand...
Click to collapse
Hello,
I hope I have understood your problem correctly.
Keep an int named selectedIndex. When a list item is clicked, store the index of the clicked list item in selectedIndex. Then each time the up/down arrow is pressed you should swap the list item at selectedIndex with the item at selectedIndex - 1/ selectedIndex + 1 and do selectedIndex--/selectedIndex++ depending on which arrow was pressed. Then call
myAdapter.notifyDataSetChanged().
Then finally when the "Done" button is pressed, make your arrows invisible and store the changes in the database.
Please let me know if this was helpful to you
I do that and the ITEM is swapping ok, but the arrows aren't...See if I can explain it
<upArrow> This is LiistView Row1 <downArrow>
This is ListView Row 2
If I press the downArrow, I get:
This is ListView Row 2
This is LiistView Row1
....
<upArrow> This is ListView Row 14 <downArrow>
For some reason, the arrows are at like a "random" position. I need the arrows to follow the item...like:
<upArrow> This is ListView Row 2 <downArrow>
This is LiistView Row1
Have you made a ListLayout XML that defines each row of your list to have a layout that looks something like this?
Image Text Image
You could simply make the arrow images visible for the list row which is selected and invisible for those which aren't. That way you don't have to worry about changing the positions of the images. It should work but I guess there would be a better way to do it rather than making so many ImageViews.
Can you please please post your ListLayout XML if you have already defined it? Also please explain what you do to change the position of the arrow images when they are clicked.
Custom Listview; I don't have code to "change the position", that's the TOPIC of my thread! ROFL
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:id="@+id/layout">
<ImageView android:id="@+id/up" android:layout_width="wrap_content"
android:layout_height="fill_parent" android:src="@drawable/up"
android:gravity="left" android:layout_alignParentLeft="true"
android:layout_alignParentBottom="true"
androidnClick="onClick"
android:visibility="invisible"/>
<TextView android:id="@+id/toptext"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="20dip"
android:textStyle="bold"
android:layout_toRightOf="@+id/up" />
<TextView android:id="@+id/bottomtext" android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:textSize="18dip" android:layout_below="@+id/toptext"
android:layout_alignParentBottom="true"
android:layout_toRightOf="@+id/up" />
<ImageView android:id="@+id/down" android:layout_width="wrap_content"
android:layout_height="30dip" android:src="@drawable/down"
android:gravity="right" android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
androidnClick="onClick"
android:visibility="invisible"/>
</RelativeLayout>
// Show arrows onClick
@Override
public void onItemClick(AdapterView<?> adapter, View v, int pos, long id) {
ImageView u = (ImageView) v.findViewById(R.id.up);
ImageView d = (ImageView) v.findViewById(R.id.down);
u.setVisibility(View.VISIBLE);
d.setVisibility(View.VISIBLE);
}
});
Click to expand...
Click to collapse
And what do you do when the arrow is clicked?
EDIT:
Can you please show the code for that too?
Not going to post actual code, but rest assured, it works. It's just a simple swap of list item, like:
// This is an "up" arrow click
temp = myList.get(pos); //where pos is row of item clicked
myList.set(pos - 1, myList.get(pos));
myList.set(pos, temp)
This works fine..tested it 100 times In my custom ArrayAdapter, if I set the up and down arrows to invisible, it works fine. Client wants the arrows to follow the item, in other words, swap the arrows too. This is the point I can't quite wrap my head around LOL
Have you tried using the ListView.getChildAt(iint) method to access the lists' rows' image views and then set them to their proper visibility in the method where you swap the items?
EDIT:
Sorry if i'm unable to help =/
Don't worry about it Like I've been saying, I just can't wrap my head around it. LOL
I'm working with setting the "tag" of each row to it's position in the list and then use "findViewWithTag", but still not having any luck.
I'm sure it's one of those "oh, duh moments" you get once you figure it out.
Thanks for trying...you did get me thinking about some new ideas and that's always a good thing!
Roots
Rootstonian said:
I do that and the ITEM is swapping ok, but the arrows aren't...See if I can explain it
<upArrow> This is LiistView Row1 <downArrow>
This is ListView Row 2
If I press the downArrow, I get:
This is ListView Row 2
This is LiistView Row1
....
<upArrow> This is ListView Row 14 <downArrow>
For some reason, the arrows are at like a "random" position. I need the arrows to follow the item...like:
<upArrow> This is ListView Row 2 <downArrow>
This is LiistView Row1
Click to expand...
Click to collapse
I assume you're using a list adapter right? Why not include the arrow status as a class member of whatever class it is that you are using as the base for the list adapter?
Yes Gene and I'm not sure what you mean. See if I can code a skeleton of what I have.
Code:
public class ReorderList extends ListActivity {
// standard on create stuff
// some code for app
// setup list adapter with my xml file
lv.setOnItemClickListener(new ListView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapter, View v, int pos, long id) {
ImageView u = (ImageView) v.findViewById(R.id.up);
ImageView d = (ImageView) v.findViewById(R.id.down);
u.setVisibility(View.VISIBLE);
d.setVisibility(View.VISIBLE);
}
});
} // end ReorderList class
private class mAdapter extends ArrayAdapter<String> {
public mAdapter(Context context, int textViewResourceId,ArrayList<String>editList) {
super(context, textViewResourceId, editList);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// bunch of stuff in here, but at end, I set up and down arrows to invisible
// this works perfect, except the arrows are gone and you have to click
// on the item again to move it; client doesn't like that
// If I don't set to invisible, row 12 has the arrows
}
public void onClick(View v) {
// this just swaps items based on up or down arrow press
// works fine
}
OK, I see. You're just using "String" as the base to initialize the template. Instead, create a new class:
Code:
class MyListType{
String str;
Boolean bIsArrowEnabled;
}
Now initialize your template with MyListType:
Code:
private class mAdapter extends ArrayAdapter<MyListType> {
public mAdapter(Context context, int textViewResourceId,ArrayList<MyListType>editList) {
super(context, textViewResourceId, editList);
}
You'll have to work some other issues out using this approach, but no instead of just a string in your editList, you got a string and a boolean. The boolean is part of the class so no matter where editList ends up in the list, the boolean is part of it.
Still having problems with this. Here's a dumb question LOL...
When I hit one of my arrows, I swap the list items and call notifyDataSetChanged(), which calls the @Overrided public View getView(.....). At the end of this method, there is a return....where in the code is this "sitting" on the return? It's not back to onCreate or onResume...I toasted them and no message. But the onItemClick() listener is "active" and working in onCreate().
Gotta love Android programming
//********************** Nevemind, I got it...i think
It involved setting the tagId for each row in the list view. Based on which arrow is pressed, I set a boolean value to true. If up, set images visible to tagId - 1 or tagId + 1 for down
Questions or Problems Should Not Be Posted in the Development Forum
Please Post in the Correct Forums
Moving to Q&A

[Q] How To pull data from a database into a scrollable list?

Hi all,
I'm new to Android development but have been going through countless tutorials. One thing I haven't found a tutorial for is how to take a list of items from a database and put them into a list that a user can scroll through and then select one of them to open up a second screen.
E.g. if I have colors in my database, the screen would simply show all the colors in a list that I can scroll through to find the one I want. When I find the one I want, I can then select it to open up a second layout with the details.
Can anyone direct me to a tutorial or information that might go over this? Or just give me some hints as to what I should search for since my attempts didn't return anything relevant.
Thanks.
Ok, here we go:
First you need to create a layout with at least a ListView, and set it to the current activity using setContentView.
Read some data from your database (I dunno how do this, sorry), and add it to a String array or a List<String> (any of them should work).
Set an ArrayAdapter to the array (or List).
Obtain a reference to your layout ListView using findViewById. Set the ArrayAdapter to that reference.
Your list now is filled
To handle the click events, you'll need declare this method:
Code:
YourListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> a, View v, int position, long id) {
//Here the code to handle clicks
//You can use a switch method, using position as variable, to know wich of the items was clicked
}
});
Example
Please use the Q&A Forum for questions &
Read the Forum Rules Ref Posting
Moving to Q&A

Help with spinner

So this is actually help making an app not a ROM. I am trying to use a spinner in my app as a drop down menu.
Here is the xml code:
<Spinner
android:id="@+id/fromSpinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:spinnerMode="dropdown"
android:entries="@array/from_array" />
Here is the Java code:
Spinner fromSpinner = (Spinner) findViewById(R.id.fromSpinner);
Spinner toSpinner = (Spinner) findViewById(R.id.toSpinner);
ArrayAdapter<String> toAdapter = new ArrayAdapter<String>(this, R.id.toSpinner, R.array.to_array);
toSpinner.setAdapter(toAdapter);
ArrayAdapter<String> fromAdapter = new ArrayAdapter<String>(this, R.id.fromSpinner, R.array.from_array);
fromSpinner.setAdapter(fromAdapter);
String toCurrency = (String) toSpinner.getSelectedItem();
String fromCurrency = (String) fromSpinner.getSelectedItem();
I'm not sure what the adapters do but I think I need them. Anyway toCurrency and fromCurrency aren't getting the values they are supposed to get. Anyone know what I am doing wrong. I am a complete noob say it may be something really dumb.
Don't know if this is helpful. Just put the source for the whole app at https://github.com/Dmobbjr/CurrencyCalculator
Really? I know some developers here could figure this out in ~10 minutes.
I'm not able to look deeper but it would help for next time if you could post the value you are getting and the value that should be there.
I'm going to guess you are getting either the first element in the array or null?
You haven't selected a value anywhere and there is no evidence of a user interaction before you try and get the selected value so either there is no value selected or the first element in the array is selected (by default) and you are getting its value.
Have you looked through the documentation for Spinners in the API Guides section of the Android Developers website? I can tell the answer is no because if you had you would know why you need the Adapters.
Kavrocks said:
I'm not able to look deeper but it would help for next time if you could post the value you are getting and the value that should be there.
I'm going to guess you are getting either the first element in the array or null?
You haven't selected a value anywhere and there is no evidence of a user interaction before you try and get the selected value so either there is no value selected or the first element in the array is selected (by default) and you are getting its value.
Have you looked through the documentation for Spinners in the API Guides section of the Android Developers website? I can tell the answer is no because if you had you would know why you need the Adapters.
Click to expand...
Click to collapse
I will change it to see what the value is later but I know it is not getting the value of the first element.
The user interaction happens before any of the code above is executed. I assumed that when I create the spinners and adapters in java it just takes what was already selected. Do I have to initialize the spinners and adapters before user selection?
Also I did read the documentation which is why I even knew about adapters but I am still a noob so some of the docs can be pretty confusing.
dmobbjr said:
I will change it to see what the value is later but I know it is not getting the value of the first element.
The user interaction happens before any of the code above is executed. I assumed that when I create the spinners and adapters in java it just takes what was already selected. Do I have to initialize the spinners and adapters before user selection?
Click to expand...
Click to collapse
The spinner needs to be initialised with data before the user selects it otherwise it would be empty. That's what the ArrayAdapter in your OP is for (which is explained in the API Guides section on spinners), however the android:entries attribute in your xml file is also adding data to the spinner so you have redundant code.
The getSelectedItem() will return an Object containing the currently selected item but as you are changing the data in the spinner beforehand this could be altering the data in the selected item position.
I recommend you remove the android:entries attribute and move the code except for the getSelectedItem() lines to the onCreate() method of your Activity.
You really need to provide more info for me about what is happening for me to help. I can't view the source on github at the moment.
If I implement the spinners in onCreate(), how do I access them from my button's onClick() method. Wouldn't the spinners be local to the onCreate method and therefore not accessible outside of it?
dmobbjr said:
If I implement the spinners in onCreate(), how do I access them from my button's onClick() method. Wouldn't the spinners be local to the onCreate method and therefore not accessible outside of it?
Click to expand...
Click to collapse
You aren't implementing them in onCreate(), they are implemented in xml which is normally inflated in onCreate() when you call setContentView(). All you are doing is adding the data to them in onCreate(). After the layout is inflated everything in that layout file is global (can be accessed anywhere) to that class.
You can get a reference to them anywhere in your code, providing the layout that contains them has been inflated into memory, using findViewById() and passing in the id of the spinner you want to get a reference to.
You can declare a class variable to store the reference to these and then just get the reference once in onCreate() and access it anywhere else in your code, ie. in onClick(), instead of having persistant calls to findViewById(). This approach is more efficient and cleaner.
When I try to call findViewById(toSpinner).getSelectedItem() The compiler says it can't resolve toSpinner as a variable. When I try to call R.id.toSpinner.getSelectedItem() it says it can't invoke getSelectedItem() on and int. I still cant access the spinners from within my onClick(). Sorry for the extreme noobishness but I just clearly do not know as much java as I should.
dmobbjr said:
When I try to call findViewById(toSpinner).getSelectedItem() The compiler says it can't resolve toSpinner as a variable. When I try to call R.id.toSpinner.getSelectedItem() it says it can't invoke getSelectedItem() on and int. I still cant access the spinners from within my onClick(). Sorry for the extreme noobishness but I just clearly do not know as much java as I should.
Click to expand...
Click to collapse
You are calling findViewById() returns a View object, you can't call getSelectedItem() on a View object. You first need to cast the View returned by findViewById to a spinner and then call getSelectedItem() on the spinner.
R.id.toSpinner is just an integer value pointing to a resource.
I already pointed out how you should go about calling getSelectedItem() on your spinner.
You can declare a class variable to store the reference to these and then just get the reference once in onCreate() and access it anywhere else in your code, ie. in onClick(), instead of having persistant calls to findViewById(). This approach is more efficient and cleaner.
Click to expand...
Click to collapse
I'll write the outline of the code you need for you.
Code:
public class TestActivity extends Activity {
private Spinner toSpinner;
public void onCreate() {
toSpinner = (Spinner) findViewById(R.id.toSpinner);
}
public void onClick() {
toSpinner.getSelectedItem();
}
}

Categories

Resources