In a project there will be lots of pages(activities) and user will be able to switch between these pages (activities). So when user press the corresponding button that opens page_2 from page_1, I need to create a new Activity. However, if user comes back to page_1 and try to open the page_2 again, there will be a new Activity created again, instead of opening the previously created activity ( I want user to see the page_2 as he/she left it without anychanges). So I want to put something like
if(SecondActivity==null)
{
//Create new activity
}
start(new_activity);
Here is the corresponding code ( I couldn't implement onClickListener because I couldn't disable it in onPause() method... so I used onClick from xml)
public class MainActivity extends Activity {
private View.OnClickListener openSecondPage = new View.OnClickListener() {
#Override
public void onClick(View v) {
Button button_newPage = findViewById(R.id.button_newpage);
button_newPage.setText("Clicked");
Intent secondPage = new Intent(getApplicationContext(), SecondActivity.class );
startActivity(secondPage);
}
};
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onResume(){
super.onResume();
//Button button_newPage = findViewById(R.id.button_newpage);
// button_newPage.setOnClickListener(openSecondPage);
}
public void onPause(){
super.onPause();
//Destroy the on click listener
Button button_newPage = findViewById(R.id.button_newpage);
// button_newPage.setOnClickListener(null);
}
public void openSecondPage(View v)
{
Intent secondPage = new Intent(getApplicationContext(), SecondActivity.class );
startActivity(secondPage);
}
}
Edit: Here is the new code with Flags:
MainActivity.java code:
public class MainActivity extends Activity {
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onResume(){
super.onResume();
}
public void onPause(){
super.onPause();
}
public void openSecondPage(View v)
{
Intent secondPage = new Intent(getApplicationContext(), SecondActivity.class );
secondPage.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
startActivity(secondPage);
}
}
SecondActivity.java code:
public class SecondActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.secondactivity);
}
protected void onResume()
{
super.onResume();
}
public void goBack(View v)
{
}
public void goMainPage(View v)
{
Intent mainPage = new Intent(getApplicationContext(),MainActivity.class);
mainPage.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
startActivity(mainPage);
}
}
I think you can resolve problem by FLAG_ACTIVITY_REORDER_TO_FRONT flag.
You need to set flag when start activity.
public void openSecondPage(View v) {
Intent secondPage = new Intent(getApplicationContext(), SecondActivity.class);
secondPage.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(secondPage);
}
You can find more detailed information in this link.
https://developer.android.com/guide/components/activities/tasks-and-back-stack
Show Activity A, then when you need it then show Activity B, then when you need it then show Activity A again, by calling startActivity + setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) => Activity A will show up as it was exactly before showing Activity B
According to your question asked, it seems you have to use either Room or SharedPreference in SecondActivity to save the user input data.
So, whenever you come back to SecondActivity, check if there is already data available. If there is a data available, show it to the user else set the fields with default values.
Related
I want to show launcher screen in Android app only once. Then if the user is on the second screen, if he presses back button, I want app to close. What's wrong in this code? The first screen shows again, what mustn't be.
public class MainActivity extends Activity {
private boolean firstscreenshown=false;
#Override
protected void onCreate(Bundle savedInstanceState) {
if (firstscreenshown==true) finish();
firstscreenshown=true;
or
public class MainActivity extends Activity {
private boolean firstscreenshown;
public MainActivity() {
this.firstscreenshown = false;
}
#Override
protected void onCreate(Bundle savedInstanceState) {
if (firstscreenshown==true) finish();
firstscreenshown=true;
Use this code for handle back button in your MainActivity class:
#Override
public void onBackPressed()
{
// TODO Auto-generated method stub
super.onBackPressed();
Intent startMain = new Intent(Intent.ACTION_MAIN);
startMain.addCategory(Intent.CATEGORY_HOME);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(startMain);
}
I have a disclaimer view that I display the first time my app is run. Here is how I handle it:
public class MainActivity extends Activity {
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// check preferences to see if disclaimer has been display
boolean showDisclaimer = getPreferences(MODE_PRIVATE).getBoolean("disclaimer", true);
if (showDisclaimer) {
// turn off the disclaimer
getPreferences(MODE_PRIVATE).edit().putBoolean("disclaimer",false).commit();
// display the disclaimer
Intent intent = new Intent(MainActivity.this, LegalActivity.class);
startActivity(intent);
}
setContentView(R.layout.activity_main);
}
Here is the activity for the disclaimer:
public class LegalActivity extends Activity {
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.legal_detail);
// Watch for guide button clicks.
Button button = (Button) this.findViewById(R.id.legal_button);
button.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
finish();
}
});
}
My disclaimer view has a done button which closes it.
Hope this helps!
Call finish after your call to the second activity, so when the second screen appears the previous one will be erased.
startActivity(intent)
The best and simplest way to achieve this would be to override onPause() method and call :
finish();
inside the first activity!
I have a button which I am assigning an OnClickListener to. I want to start a new intent as a result of this. In order to do that, I have to reference the activity. The only one I know how to do this is via something like the following code. Is this the best way to start an intent from a button click? Also, what kind of memory implications will there be for this?
public class SomeActivity extends FragmentActivity {
private final FragmentActivity self=this;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.startButton).setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
Intent intent=new Intent(self,someClass.class);
startActivity(intent);
}
});
}
The best way to do this is to simply pass ActtivityName.this, like this:
public class SomeActivity extends FragmentActivity {
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.startButton).setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
Intent intent=new Intent(SomeActivity.this,someClass.class);
startActivity(intent);
}
});
}
Another way to do this will be calling :
findViewById(R.id.startButton).setOnClickListener(this);
Then make your Activity implement View.OnClickListener and implement the methods onClick(View v) in this way :
public void onClick(View v) {
switch(v.getId()) {
case R.id.startButton:
Intent intent=new Intent(self,someClass.class);
startActivity(intent);
break;
// Handle click on other views
}
}
It prevents from instantiating a listener and should be a bit better for memory consumption.
I have 2 activities. One called Login and another called ListDeals. Login has a form with a submit button which, when pressed, should switch our activity to ListDeals. This works.
However, in Logcat I don't get a message saying that the activity has started. Also, when in ListDeals, if the user presses the back button, both activities should be killed. I looked around and this is what I came up with:
public class Login extends Activity {
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login_screen);
Button submit=(Button)findViewById(R.id.submit);
submit.setOnClickListener(onSubmit);
}
private View.OnClickListener onSubmit=new View.OnClickListener() {
#Override
public void onClick(View view) {
Intent myIntent=new Intent(view.getContext(),ListDeals.class );
startActivityForResult(myIntent,0);
}
};
#Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.login_screen, menu);
return true;
}
#Override
public void onActivityResult(int requestCode,int resultCode, Intent data) {
if(resultCode==2) {
finish();
}
}
}
public class ListDeals extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.deals_list);
System.out.println("starting activity");
}
#Override
protected void onDestroy() {
System.out.println("dude");
setResult(2);
super.onDestroy();
}
protected void onStop(){
setResult(2);
super.onStop();
}
}
However, when I press the back button, It takes me back to the Login activity which is not what I want.
In your click handler, onSubmit, just finish your login activity, like this. That way, it won't be on the activity stack, and as a result, pressing back from your other activity will bring the user back to where they started.
private View.OnClickListener onSubmit=new View.OnClickListener()
{
#Override
public void onClick(View view)
{
Intent myIntent=new Intent(view.getContext(),ListDeals.class);
startActivity(myIntent);
finish();
}
};
Also, to address you second question, use the Log class methods, such as Log.i or Log.d for debug messages, those will show up in logcat.
Finish Login before starting the new Activity. Besides you don't need the result.
private View.OnClickListener onSubmit=new View.OnClickListener() {
#Override
public void onClick(View view) {
Intent myIntent=new Intent(Login.this, ListDeals.class );
startActivity(myIntent);
Login.this.finish() // add this to finish it.
}
};
I have an Android App That requires a button to open up a new xml page. This is what it's like now, could someone add the necessary code to make it open Page2Activity when I click on the button? Code:
public class MainActivity extends Activity {
/** Called when the activity is first created. */
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Void onClick;View arg0; {
// TODO Auto-generated method stub
}
};
}
I figured this out using this method : http://stackoverflow.com/questions/4094103/linking-xml-pages-with-layout ,but I will try All of yours as well.
Try this code:
public void handleClick(View v){
//Create an intent to start the new activity.
Intent intent = new Intent();
intent.setClass(this,Page2Activity.class);
startActivity(intent);
}
Then create a new cLass called Page2Activity.
Hope this helps and don't forget to add your activity to the manifest file.
i think you mean something like this:
public class MyClass extends Activity {
/** Called when the activity is first created. */
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button1 = (Button)findViewById(R.id.button1);
button1.setOnClickListener(new OnClickListener() {
#Override
public void onClick(View v) {
Intent i = new Intent("com.myaction");
startActivity(i);
}
});
}
}
I'm beginner in Java Android developing. I'm using Eclipse SDK 3.6.1 version. I'm trying to do call new intents, but my app is always unexpectedly stopped. Do am I correctly call new intents?
First class:
public class first extends Activity {
/** Called when the activity is first created. */
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button SignIn = (Button) findViewById(R.id.SignIn);
SignIn.setOnClickListener(new OnClickListener() {
#Override
public void onClick(View v) {
EditText pw = (EditText) findViewById(R.id.editPasswd);
if(pw.getText().toString().equals("123")) {
Intent intent = new Intent(first.this, second.class);
startActivity(intent);
}
else {
Toast.makeText(getBaseContext(), "Wrong PIN" ,
Toast.LENGTH_LONG).show();
}
}});
}
}
Second class:
public class second extends Activity {
/** Called when the activity is first created. */
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.loginas);
Button Button01 = (Button) findViewById(R.id.Button01);
Button01.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
if(v.getId() == R.id.Button01) {
Intent intent = new Intent(second.this, third.class);
startActivity(intent);
}}
});
}
}
Third class:
public class third extends Activity {
/** Called when the activity is first created. */
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.lock);
}}
When I put correct pin code the app show messages "the application () has stopped unexpectedly. Please try again". First I want to know that my code is correct.
whatever the activity u want to display must and mension those activities in AndroidManifest.xml file.For example in ur application first,second,third activities mention in AndroidManifest.xml file