关于不同布局的背压法
On Back press method with different layouts
我有一个 activity,上面有两个按钮。每个按钮都会打开一个新布局。现在,如果我按下回键,我的应用程序将关闭。但我想 return 在 Main 上activity 并且如果用户再次按下然后应用程序关闭,如果他不按下并转到第二个布局并按下返回那么应用程序不应该被关闭。条件应该是如果用户在 Mainactivity 上并且他按下后退按钮然后应用程序关闭。
如果我可以设置此条件,我想出了一个关于 onBackPress 方法的想法
if (k==1 && Its not a Mainactivity(or the user is not inside a Mainactivity)) {//I dont know how to check for that
Intent i = new Intent(this,Mainactivity.class);
startActivity(i);
this.finish();
} else if (k==1 && Its a Mainactivity(or the user is inside a Mainactivity)) {
this.finish(); //then i just want to close the application,I dont know this.finish() ,It does not close the app but still it runs in background
}
如果你们想在这里看到我的代码,这是我想要实现的一个简单示例:-
public class MainActivity extends AppCompatActivity {
Button btn1,button2; //Creating button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn1= (Button)findViewById(R.id.btn1); //finding button1
button2=(Button)findViewById(R.id.button2); //finding button2
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setContentView(R.layout.btn1);
}
});
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setContentView(R.layout.btn2);
}
});
}
}
请帮帮我
onBackPressed()
的默认行为是关闭当前 Activity
。在您的情况下,只有一个 Activity
即 MainActivity
您正在更改布局。
因为您要更改整个内容,所以您不妨在那里创建一个新的 Activity
和 setContentView(R.layout.btn1)
。并在 onClick()
个按钮中启动这个新的 activity。您将获得所需的功能。
在onBackPressed()
中,只需检查k
的值。如果k
的值为1
或2
,则
再次调用 setContentView(R.layout.activity_main)
显示主要 layout
否则调用 super.onBackPressed()
关闭 MainActivity
.
您需要在每次设置 activity_main
布局后调用方法 initializeButtons()
以从布局中获取 reference
按钮以及添加 onClick
侦听器。
试试这个:
public class MainActivity extends AppCompatActivity {
Button button1, button2;
int k = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initializeButtons();
}
public void initializeButtons() {
button1 = (Button) findViewById(R.id.btn1);
button2 = (Button) findViewById(R.id.button2);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
k = 1;
setContentView(R.layout.btn1);
}
});
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
k = 2;
setContentView(R.layout.btn2);
}
});
}
@Override
public void onBackPressed() {
if (k == 1 || k == 2) {
k = 0;
setContentView(R.layout.activity_main);
initializeButtons();
} else {
super.onBackPressed();
}
}
}
更新:
根据 comment
部分中的讨论,如果您想在 back
按下期间再次打开 Mainctivity
,则按如下方式覆盖和更新 onBackPressed()
:
@Override
public void onBackPressed() {
if (k == 1 || k == 2) {
k = 0;
Intent i = new Intent(this, MainActivity.class);
startActivity(i);
} else {
super.onBackPressed();
}
}
希望对你有所帮助~
你的问题是你应该为每个 activity 做单独的布局。当你点击 btn1
时,它会转到另一个 activity.
但是在您的代码中,您只更改了 MainActivity
的内容。
所以您应该使用 Intent
在活动之间移动。
像这样:
Intent intent = new Intent (MainActivity.this, SecondAvtitity.class);
因此布局会发生变化,当您按下 back button
时,应用程序将返回 MainActivity
。
当您在 MainActivity
并按下后退按钮时,应用程序将关闭。
为了更好的解释,我制作了一个示例应用程序:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button1 = (Button) findViewById(R.id.button1);
Button button2 = (Button) findViewById(R.id.button2);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
}
});
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, ThirdActivity.class);
startActivity(intent);
}
});
}
}
您可以维护之前添加的所有布局的堆栈。先添加一个实例变量:
Stack<Integer> layoutHistoryStack = new Stack<>();
然后,添加这两个方法:
@Override
public void onBackPressed() {
if(layoutHistoryStack.size() == 1) {
// the first layout that was added is shown. finish()
layoutHistoryStack.pop();
finish();
return;
}
// pop() the current layout
layoutHistoryStack.pop();
// show the prev
setContentView(layoutHistoryStack.peek(), false);
}
public void setContentView(@LayoutRes int layoutResID, boolean addToHistoryStack) {
if(addToHistoryStack) layoutHistoryStack.add(layoutResID);
super.setContentView(layoutResID);
}
然后,将之前的每个 setContentView(R.id.layout)
调用替换为 setContentView(R.id.layout, true)
,即添加到您的 layoutHistoryStack
。
这个怎么样。真的很好用
我已经完成了Ferdous's snippet
:
public class MainActivity extends AppCompatActivity {
int k = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button1 = (Button) findViewById(R.id.button1);
Button button2 = (Button) findViewById(R.id.button2);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
k = 1;
setContentView(R.layout.activity_second);
}
});
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
k = 2;
setContentView(R.layout.activity_third);
}
});
}
@Override
public void onBackPressed() {
if (k == 1 || k == 2) {
k = 0;
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
} else {
this.finishAffinity();
}
}
}
我有一个 activity,上面有两个按钮。每个按钮都会打开一个新布局。现在,如果我按下回键,我的应用程序将关闭。但我想 return 在 Main 上activity 并且如果用户再次按下然后应用程序关闭,如果他不按下并转到第二个布局并按下返回那么应用程序不应该被关闭。条件应该是如果用户在 Mainactivity 上并且他按下后退按钮然后应用程序关闭。 如果我可以设置此条件,我想出了一个关于 onBackPress 方法的想法
if (k==1 && Its not a Mainactivity(or the user is not inside a Mainactivity)) {//I dont know how to check for that
Intent i = new Intent(this,Mainactivity.class);
startActivity(i);
this.finish();
} else if (k==1 && Its a Mainactivity(or the user is inside a Mainactivity)) {
this.finish(); //then i just want to close the application,I dont know this.finish() ,It does not close the app but still it runs in background
}
如果你们想在这里看到我的代码,这是我想要实现的一个简单示例:-
public class MainActivity extends AppCompatActivity {
Button btn1,button2; //Creating button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn1= (Button)findViewById(R.id.btn1); //finding button1
button2=(Button)findViewById(R.id.button2); //finding button2
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setContentView(R.layout.btn1);
}
});
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setContentView(R.layout.btn2);
}
});
}
}
请帮帮我
onBackPressed()
的默认行为是关闭当前 Activity
。在您的情况下,只有一个 Activity
即 MainActivity
您正在更改布局。
因为您要更改整个内容,所以您不妨在那里创建一个新的 Activity
和 setContentView(R.layout.btn1)
。并在 onClick()
个按钮中启动这个新的 activity。您将获得所需的功能。
在onBackPressed()
中,只需检查k
的值。如果k
的值为1
或2
,则
再次调用 setContentView(R.layout.activity_main)
显示主要 layout
否则调用 super.onBackPressed()
关闭 MainActivity
.
您需要在每次设置 activity_main
布局后调用方法 initializeButtons()
以从布局中获取 reference
按钮以及添加 onClick
侦听器。
试试这个:
public class MainActivity extends AppCompatActivity {
Button button1, button2;
int k = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initializeButtons();
}
public void initializeButtons() {
button1 = (Button) findViewById(R.id.btn1);
button2 = (Button) findViewById(R.id.button2);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
k = 1;
setContentView(R.layout.btn1);
}
});
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
k = 2;
setContentView(R.layout.btn2);
}
});
}
@Override
public void onBackPressed() {
if (k == 1 || k == 2) {
k = 0;
setContentView(R.layout.activity_main);
initializeButtons();
} else {
super.onBackPressed();
}
}
}
更新:
根据 comment
部分中的讨论,如果您想在 back
按下期间再次打开 Mainctivity
,则按如下方式覆盖和更新 onBackPressed()
:
@Override
public void onBackPressed() {
if (k == 1 || k == 2) {
k = 0;
Intent i = new Intent(this, MainActivity.class);
startActivity(i);
} else {
super.onBackPressed();
}
}
希望对你有所帮助~
你的问题是你应该为每个 activity 做单独的布局。当你点击 btn1
时,它会转到另一个 activity.
但是在您的代码中,您只更改了 MainActivity
的内容。
所以您应该使用 Intent
在活动之间移动。
像这样:
Intent intent = new Intent (MainActivity.this, SecondAvtitity.class);
因此布局会发生变化,当您按下 back button
时,应用程序将返回 MainActivity
。
当您在 MainActivity
并按下后退按钮时,应用程序将关闭。
为了更好的解释,我制作了一个示例应用程序:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button1 = (Button) findViewById(R.id.button1);
Button button2 = (Button) findViewById(R.id.button2);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
}
});
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, ThirdActivity.class);
startActivity(intent);
}
});
}
}
您可以维护之前添加的所有布局的堆栈。先添加一个实例变量:
Stack<Integer> layoutHistoryStack = new Stack<>();
然后,添加这两个方法:
@Override
public void onBackPressed() {
if(layoutHistoryStack.size() == 1) {
// the first layout that was added is shown. finish()
layoutHistoryStack.pop();
finish();
return;
}
// pop() the current layout
layoutHistoryStack.pop();
// show the prev
setContentView(layoutHistoryStack.peek(), false);
}
public void setContentView(@LayoutRes int layoutResID, boolean addToHistoryStack) {
if(addToHistoryStack) layoutHistoryStack.add(layoutResID);
super.setContentView(layoutResID);
}
然后,将之前的每个 setContentView(R.id.layout)
调用替换为 setContentView(R.id.layout, true)
,即添加到您的 layoutHistoryStack
。
这个怎么样。真的很好用
我已经完成了Ferdous's snippet
:
public class MainActivity extends AppCompatActivity {
int k = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button1 = (Button) findViewById(R.id.button1);
Button button2 = (Button) findViewById(R.id.button2);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
k = 1;
setContentView(R.layout.activity_second);
}
});
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
k = 2;
setContentView(R.layout.activity_third);
}
});
}
@Override
public void onBackPressed() {
if (k == 1 || k == 2) {
k = 0;
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
} else {
this.finishAffinity();
}
}
}