I'm new to Android programming, and I'm trying to make a simple button which displays a toast notification when clicked.
I tried to initialize a button called "button" in my MainActivity like so:
public class MainActivity extends Activity implements View.OnClickListener {
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button =(Button)findViewById(R.id.button1);
button.setOnClickListener(this);
}
public void onClick(View v){
Toast toast = Toast.makeText(this, "Click Me", Toast.LENGTH_LONG);
toast.show();
}
}
Also, here is activity_main.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">
<Button
android:id="#+id/button1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="#string/button1">
</Button>
</RelativeLayout>
UPDATE: findViewById now works fine after importing android.R. However, this created a new error when I call setContentView(R.layout.activity_main);
Okay a bit of background here. strings.xml is for defining pieces of text. For instance the text that might go on a button (but this does not define the button itself).
The button is going to have to be defined in a layout file in the res/layout/ directory. Yours is likely called activity_main.xml.
You'll need to create a button element in this file and assign the id to something descriptive. This kind of id is what findViewById is going to search on.
An example:
<Button
android:id="#+id/thebuttonsid"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="96dp"
android:text="#string/button1" />
You can get a handle to this button like so:
Button button = (Button)findViewById(R.id.thebuttonsid);
Notice how I set the text to #string/button1? This is what the strings.xml file is for. However the layout files in the layout directory are where you define controls like buttons.
The button's ID name is same to the button's text name. You'd better change any one to other name.It must be work.
I would clean the project and build again. Or reimport the project. Eclipse is ... just hard to use. Try to use Android Studio.
When there is some "mismatch" with resources cleaning a project is a good advice. IN the past it was even more so.
Next what I would check if your resources compile as such. You might have an error somewhere in your resources, therefore the R does net get compiled and any reference to R.id.* is not valid.
Related
In the app I'm building, I'm hoping to have several different guides / tutorials that will each contain several paragraphs and hopefully pictures in them. Right now the only thing I would know to do is to have all of the different texts written out long form in my strings resource file. I would then need to have separate layouts and fragments for each tutorial.
Is there an easier way? Can I separate my strings resource file at least so that I don't have that one file completely bogged down? Could I maybe import the text from a separate file?
Yes, you can. you need to set text programmatically. You need only one layout for all of these same type information page.
Let's say you have
<TextView
android:id="#+id/text_view_id"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="#string/hello" />
You can get that text view from java activity like below and set the text you want..
public class MainActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final TextView helloTextView = (TextView) findViewById(R.id.text_view_id);
helloTextView.setText(R.string.user_greeting);
}
}
you can do this setText process by adding a switch, if or any conditional checking process like below
switch(expression) {
case value :
helloTextView.setText(R.string.firstPageText);
break;
case value :
helloTextView.setText(R.string.secondPageText);
break; // optional
// You can have any number of case statements.
helloTextView.setText(R.string.defaultText);
// Statements
}
PS: I think you can use different text style while you creating resource text. You can follow this https://www.myandroidsolutions.com/2017/09/29/android-html-textview/#.W9pu1mgzaUk for it.
Why can't I use setContentView(R.layout.main) in last line without setContentView(tv)? Please explain this to me.
package com.mue.helloworld;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class HelloWorldActivity extends Activity
{
/** Called when the activity is first created. */
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
tv.setText("Hello, Android i am suvankar");
setContentView(tv);
}
}
You have to define the textview in the R.layout.main ( a xml file) this file contains the information of the objects in the activity.
if you are using eclipse you can simple drag and drop a textview, just open the main file.
(folder res -> layout -> main.xml)
then yo have to call it in your program:
setContentView(R.layout.main);
TextView tv = (TextView) findViewById(R.id.tv); //<-- yo have to use the same ID that is in the main.xml file
and then you can set the text. all of this in the oncreate function.
tv.setText("Hello, Android i am suvankar");
Well, I hope I've helped. is my first response here
You shouldn't call setContentView() twice in your onCreate. Either call setContentView(R.layout.main) or call setContentView(tv) but not both. I would prefer the first of the two... but you need to make sure the TextView is declared in your layouts XML.
Lets first try to understand what setContentView() method does. Basically setContentView() places your UI on your Activity. Now to create a UI component for your Activity, you can either use xml resource (e.g. R.layout.main) or you can obtain an instance of the UI component in your code and dynamically add it to your Activity. For example
TextView tv = new TextView(this);
tv.setText("Hello, Android i am suvankar");
setContentView(tv);
In your case you created an instance of the TextView tv, set some text to it and added that to your Activity. Here you dont need to use setContentView(R.layout.main). However if you have a xml layout (main.xml) in your layouts folder like the following:
<?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"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Hello World"
/>
</LinearLayout>
and at the bottom of your application you write setContentView(R.layout.main), your should see a black screen with Hello World written on it. This is because here you created a TextView instance, set some text to it, but did not place it to your activity by calling
setContentView(tv), rather you added a completely different layout resource. If you use setContentView(tv) and at the end of your onCreate() you add setContentView(R.layout.main) then again you will see Hello World instead of "Hello, Android i am suvankar" because at the end you replaced your UI resource. However, if you forget to add your xml resource and call 'setContentView(R.layout.main)' compiler will issue an error for not finding the xml resource specified.
I'm having issues with understanding how I should organize my user interface in Android. My original plan was to create TextViews and ListViews programatically and change them when buttons are clicked, etc.
Here's my first simple attempt. viewFriends is a method within my Activity class. It's called when a menu button is pressed.
private void viewFriends()
{
mText = new TextView(this);
mText.setText("Gathering information...");
setContentView(mText);
...irrelevant code follows
Why doesn't this seemingly simple example work? How should I logically organize and manage my user interface objects (TextViews, ListViews, Buttons, etc).
Thanks.
The best work would be having those listviews and textviews in your XML files and give them a suitable ID like following:
<ListView
android:id="#+id/myList"
android:layout_width="wrap_content"
android:layout_weight="1"
/>
Just like above have your text view too in XML file an add the android:id attribute.
Once you define this way in your java file have references to them:
ListView myListObj = (ListView)findViewById(R.id.myList);
Now you have an object called myListObj in your java file and now you can do whatever you want to do with it.
:)
Let me if you find any issue in this so that I can update the answer to meet your specific need.
Don`t use setContentView in your method. Usually it should only be called once in the onCreate method of your activity.
Best predefine your bottons/TextViews in xml, get a handle for them (findViewbyId...)
and modify them that way.
If you create them programaticly, just add them to a view containter from your xml.
Like :
setContentView(R.layout.main);
Lets say in main.xml there is a LinearLayout with the id: root.
// get accces to that layout:
LinearLayout rootLayout = (LinearLayout) findViewById (R.id.root);
// create a new TextView
TextView tv1 = new TextView (this);
tv.setText("Hello!");
// add it to your base layout
rootLayout.addView(tv1);
// done! :)
Make a double check on what you are getting in "this".
change it to your java file name.this
You have to reload/refresh your activity once you change it.
Try this
#Override
protected void onResume() {
if(param.equalsIgnoreCase("gr"))
{
finish();
Intent myIntent = new Intent(yourActivity.this, yourActivity.class);
startActivity(myIntent);
}
The setText() method returns null in my application why?
public class GetValue extends Activity {
char letter = 'g';
int ascii = letter;
/** Called when the activity is first created. */
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView textView = (TextView)findViewById(R.id.txt_1);
textView.setText(ascii);
}
}
It doesn't matter what text i put in, it crashes anyway. Why does setText() keep returning null?
Thank you, in advance
Solution: My error was in the xml file. I wrote:
android:text="#+id/txt_1"
When it should say:
android:id="#+id/txt_1"
Thanks a lot for all the answers and comments!
You tried to pass an integer as parameter to setText, which assumes it is a resource ID. To display computed text, pass it as a string: textView.setText("g");
Edited: Check your XML file, I have test with something very basic and it works
<?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">
<TextView
android:id="#+id/txt_1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="myTextView"/>
</LinearLayout>
Maybe try to clean your project (Project->Clean in Eclipse), I recently have some trouble with R generation on the last ADT version.
Try this:
textView.setText(Integer.toString(ascii));
Also make sure that your layout xml has TextView txt_1
I've tried :
Integer.toString(char) and String.valueOf(char)
both didnt work.
The only solution is :
txt.setText(""+char);
This is not very efficient from optimization point of view but it does the trick :)
I am trying to create a simple button example, but when I add this code:
mButton = (Button) findViewById(R.id.button1);
it wont update my R.id file. I've tried everything including making sure automatic build is on, cleaning the project, and updating the SDK. This happens in both 1.6 and 2.2 projects.
Here's what full code is looking like:
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class NewTest extends Activity {
Button myButton;
/** Called when the activity is first created. */
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
myButton = (Button) findViewById(R.id.button1);
}
}
findViewById is looking at the R.id file for the location you refer to.
Your code will not cause the file to update as it is only looking for the button.
Creating the button in your layout will cause the R.id file to update.
<Button
android:id="#+id/button1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Button One"/>
As you are using findViewById in context, and the view for the current context is main.xml, the above button example will need to be inside the main.xml file. Otherwise if you had another button with the same name in another .xml layout, the entry would be made in your R.id file but your code would give you a null pointer exception, because the button doesn't exist in the context you are trying to reference it from.
Make sure you have proper import for your app's R class in your Activity:
import your.app.package.R;
UPDATE: this implicit import is only needed if your Activity class is not in the root of your.app.package package.
Save your project before using R.id.something
Since you are using XML based Layout make sure that you have android:id attribute in the main.xml file with "#+id/button1" as its value.......
It wouldn't update the generated R.java file when you just refer to an existing id.
It only updates when you add a resource. button01 must already exist in one of your .xml files, otherwise your 'findViewById(R.id.button1)' wouldn't compile.
I had the same problem using API 19 with the layout editor set to API 15 while trying to follow the NotePadV1 tutorial. I couldn't get the R.id.text1 to compile from the notes_row.xml file.
Originally, I had just pasted text into the xml file to generate the layout. After unsuccessfully trying deleting R and a Clean, I tried deleting the notes_row layout entirely. When I recreated the layout, I used the graphical interface to add the properties of the TextView object, just the Id #+id/text1, width and height. Then I did a Clean and compile. It worked.