답변:
제목 표시 줄에 뒤로 버튼을 만드는 간단한 두 단계가 있습니다.
먼저 제목 표시 줄에 뒤로 버튼을 추가하려는 활동에서 다음 코드를 사용하여 애플리케이션 아이콘을 클릭 할 수 있도록합니다.
ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
위 코드를 추가하면 애플리케이션 아이콘 왼쪽에 뒤로 화살표가 나타납니다.
둘째, 위의 작업을 수행 한 후에도 클릭 이벤트를 활용할 코드를 만들어야합니다. 이렇게하려면 실제로 응용 프로그램 아이콘을 클릭하면 onOptionsItemSelected
메서드가 호출됩니다. 따라서 이전 활동으로 돌아가려면 해당 메소드를 활동에 추가하고 이전 활동으로 돌아가는 Intent
코드를 입력하십시오. 예를 들어,이 활동은 당신이하고자하는 말을하자 돌아갈 이라고합니다 MyActivity
. 다시 돌아가려면 다음과 같이 메소드를 작성하십시오.
public boolean onOptionsItemSelected(MenuItem item){
Intent myIntent = new Intent(getApplicationContext(), MyActivity.class);
startActivityForResult(myIntent, 0);
return true;
}
그게 다야!
(안드로이드 개발자 API에서는 매니페스트를 엉망으로 만들고 android:parentActivityName
. 과 같은 것들을 추가 할 것을 권장 합니다.하지만 그것은 저에게 효과가없는 것 같습니다. 위의 내용은 더 간단하고 신뢰할 수 있습니다.)
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".MainActivity" />
그리고 당신의 활동에서
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
이 코드를 사용
@Override
public void onCreate(Bundle savedInstanceState) {
...
getActionBar().setDisplayHomeAsUpEnabled(true);
}
그 후이 코드를 onOptionsItemSelected
메소드에 작성하십시오.
int id = item.getItemId();
if (id==android.R.id.home) {
finish();
}
getActionBar()
나에게 null을 준다. 왜 그런지 알아?
마침내 액션 바 / 툴바에 뒤로 버튼을 제대로 추가했습니다.
@Override
public void onCreate(Bundle savedInstanceState) {
...
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
public boolean onCreateOptionsMenu(Menu menu) {
return true;
}
1.- AndroidManifest.xml에 활동을 추가하고 메타 데이터를 제공해야합니다.
<activity
android:name="com.example.myfirstapp.DisplayMessageActivity"
android:label="@string/title_activity_display_message"
android:parentActivityName="com.example.myfirstapp.MainActivity" >
<!-- Parent activity meta-data to support 4.0 and lower -->
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.myfirstapp.MainActivity" />
</activity>
2.- 활동의 onCreate 메서드에 다음 코드를 추가합니다.
@Override
public void onCreate(Bundle savedInstanceState) {
...
getActionBar().setDisplayHomeAsUpEnabled(true);
}
3.- onOptionsItemSelected를 재정의하고 NavUtils.navigateUpFromSameTask () 정적 메서드를 사용하여 스택을 탐색합니다.
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
// Respond to the action bar's Up/Home button
case android.R.id.home:
NavUtils.navigateUpFromSameTask(this);
return true;
}
return super.onOptionsItemSelected(item);
}
그러나 navigateUpFromSameTask () 사용은 앱이 현재 작업의 소유자 인 경우에만 적합합니다 (즉, 사용자가 앱에서이 작업을 시작 함). 이것이 사실이 아니고 활동이 다른 앱에 속한 작업에서 시작된 경우 Up으로 이동하면 앱에 속하는 새 작업이 생성되어야하며,이 경우 새 백 스택을 생성해야합니다.
활동이 활동을 확장하는 경우
public class YourActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_xxx);
getActionBar().setHomeButtonEnabled(true);
[...]
}
[...]
}
작업이 AppCompatActivity를 확장하는 경우
public class YourActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_xxx);
getSupportActionBar().setHomeButtonEnabled(true);
[...]
}
[...]
}
더 이상 할 일이 없습니다. 하십시오.
[선택 사항] 상위 활동을 명시 적으로 정의하려면 Manifest.xml을 다음과 같이 수정하십시오.
<application ... >
...
<!-- The main/home activity (it has no parent activity) -->
<activity
android:name="com.example.myfirstapp.MainActivity" ...>
...
</activity>
<!-- A child of the main activity -->
<activity
android:name="com.example.myfirstapp.YourActivity "
android:label="@string/title_activity_display_message"
android:parentActivityName="com.example.myfirstapp.MainActivity" >
<!-- Parent activity meta-data to support 4.0 and lower -->
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.myfirstapp.MainActivity" />
</activity>
</application>
상위 활동 지정을 참조하십시오.
활동이 확장되면 다음 과 같이 메서드 AppCompatActivity
를 재정의해야합니다 onSupportNavigateUp()
.
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
...
}
@Override
public void onBackPressed() {
super.onBackPressed();
this.finish();
}
@Override
public boolean onSupportNavigateUp() {
onBackPressed();
return true;
}
}
onBackPressed()
메서드 에서 논리를 처리 하고 해당 메서드를 호출 onSupportNavigateUp()
하면 전화기의 뒤로 단추와 도구 모음의 화살표가 동일한 작업을 수행합니다.
우선 onCreate 함수에서 다음 줄을 추가하십시오.
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
그런 다음 코드에 다음 함수를 추가하십시오.
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
Android 스튜디오에서 5.1 용 새 지원 라이브러리를 사용하는 경우 대신 AppCompatActivity에서 사용할 수 있습니다.
ActionBar actionBar = getSupportActionBar();
actionBar.setHomeButtonEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeAsUpIndicator(R.mipmap.ic_arrow_back_white_24dp);
actionBar.setDisplayShowHomeEnabled(true);
건배.
Google 이 여기에서 설명하는 가장 간단한 방법과 모범 사례 .
1. 다음에서 childActivity의 부모를 추가합니다 AndroidManifest.xml
.
<activity
android:name=".ChildActivity"
android:parentActivityName=".ParentActivity" >
</activity>
2. childActivity에서 뒤로 버튼을 활성화합니다.
myActionOrActionSupportBar.setDisplayHomeAsUpEnabled(true);
나를 위해 일했고, 당신에게도 효과가 있기를 바랍니다.
내가 찾은 좋은 시간이 지나면 테마 옵션이 내 코드의 주요 문제이며 다음은 도구 모음을 표시하는 적절한 방법입니다.
AndroidManifest 파일에서 먼저 테마 스타일을 변경해야합니다.
Theme.AppCompat.Light.DarkActionBar
to
Theme.AppCompat.Light.NoActionBar
그런 다음 활동 xml에서 다음과 같이 자신의 툴바를 호출해야합니다.
<androidx.appcompat.widget.Toolbar
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/colorPrimary"
android:id="@+id/toolbar"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
android:elevation="4dp"/>
그리고이 툴바는 다음과 같이 Java 파일에서 호출되어야합니다.
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
그리고 U를 보여주는 툴바의 경우 NullPointerException을 피하기 위해 null을 확인해야합니다.
if(getSupportActionBar() != null){
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
홈 활동의 경우 다시 추가하십시오.
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId()==android.R.id.home) {
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
또는 원하는 활동을 다시
public boolean onOptionsItemSelected(MenuItem item){
Intent myIntent = new Intent(getApplicationContext(), YourActivity.class);
startActivityForResult(myIntent, 0);
return true;
}
나는 너무 많은 콤플렉스가 대답하는 것을 보았으므로 이것이 내 코드입니다. 여기서 일 해요. 두 가지 방법으로이를 달성 할 수 있습니다.
1) Stardard 안드로이드 호환성
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.app.NavUtils;
import android.view.MenuItem;
import android.view.View;
public class EditDiscoveryActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_edit_discovery);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
/*toolbar.setNavigationIcon(R.drawable.ic_arrow_white_24dp);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
}
});*/
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
}
@Override
public boolean onSupportNavigateUp() {
onBackPressed();
return true;
}
}
2) 사용자 지정 아이콘 사용
주석에 코드를 사용하려면 ic_arrow_white_24dp.xml이라는 드로어 블에이 파일을 추가하기 만하면됩니다.
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#ffffff"
android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z"/>
</vector>
이 코드로.
toolbar.setNavigationIcon(R.drawable.ic_arrow_white_24dp);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
}
});
여기 일부 사람들에게 도움이되기를 바랍니다!
사용하지 않는 경량 버전 ActionBarActivity
은 여전히 여기에 동일한 bahaviors가 있습니다.
public class ToolbarConfigurer implements View.OnClickListener {
private Activity activity;
public ToolbarConfigurer(Activity activity, Toolbar toolbar, boolean displayHomeAsUpEnabled) {
toolbar.setTitle((this.activity = activity).getTitle());
if (!displayHomeAsUpEnabled) return;
toolbar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha);
toolbar.setNavigationOnClickListener(this);
}
@Override
public void onClick(View v) {
NavUtils.navigateUpFromSameTask(activity);
}
}
사용법 : 넣어 new ToolbarConfigurer(this, (Toolbar) findViewById(R.id.my_awesome_toolbar), true);
에서 onCreate
.
매니페스트 파일에 아래 언급 된 코드를 추가해야합니다. 뒤로 화살표 기능을 추가 할 활동을 검색합니다. 하나를 찾으면 괜찮거나 활동을 만드십시오.
<activity android:name=".SearchActivity">
</activity>
그런 다음 그 사이에 다음 세 줄의 코드를 추가합니다.
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.raqib.instadate.MainActivity" />
이 코드를 onCreate ()에 추가하는 것을 잊지 마십시오. 뒤로 화살표가 필요한 특정 활동의 방법.
Toolbar toolbar = (Toolbar) findViewById(R.id.searchToolbar);
setSupportActionBar(toolbar);
try{
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}catch(NullPointerException e){
Log.e("SearchActivity Toolbar", "You have got a NULL POINTER EXCEPTION");
}
이것이 제가 문제를 해결 한 방법입니다. 감사.
다른 답변은 Toolbar
위젯 의 XML에서도 설정할 수 있다고 언급하지 않습니다 .
app:navigationIcon="?attr/homeAsUpIndicator"
예를 들면 :
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:navigationIcon="?attr/homeAsUpIndicator"
app:popupTheme="@style/AppTheme.PopupOverlay"
app:title="@string/title_activity_acoustic_progress" />
2020 년에해야 할 모든 것 :
(MainActivity로 돌아가고 싶다고 생각하면)
protected void onCreate(Bundle savedInstanceState){
...
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
public boolean onOptionsItemSelected(MenuItem item) {
Intent myIntent = new Intent(getApplicationContext(), MainActivity.class);
startActivityForResult(myIntent, 0);
return true;
}
ActionBar를 사용하고 있다면이 문서를 읽고 싶을 것입니다. http://developer.android.com/reference/android/app/ActionBar.html#setDisplayHomeAsUpEnabled(boolean)
그런 다음 onOptionsItemSelected (MenuItem) 메소드를 덮어 써야하고 android.R.id.home 이벤트가 들어 오도록해야합니다. 그러면 사용자가 작업 표시 줄에서 뒤로 버튼을 클릭했음을 알 수 있습니다.
앱 매니페스트에서 상위 활동을 지정하여 코드 없이도 수행 할 수 있습니다. 활동 A로 이동할 활동 B의 뒤로 버튼을 원하는 경우 매니페스트에서 활동 B의 부모로 활동 A를 추가하면됩니다.
내 앱에는 언제든지 돌아가고 돌아갈 수있는 3 가지 활동이 있기 때문에 올바른 답을 얻기 위해 몇 가지 답변을 혼합해야했습니다. 활동 1> 활동 2> 활동 3. 내 activity3에서 뭔가를 할 때 뒤로 버튼이 Activity2로 올바르게 백업되었습니다. 그러나 Activity2에서를 사용 finish()
하면 Activity1이 아닌 Activity3으로 돌아갑니다. 그리고 AppCompatActivity를 확장하고 있습니다. 그래서 내 해결책은 다음과 같습니다.
public class Activity2 extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
...
getSupportActionBar().setHomeButtonEnabled(true);
}
}
AndroidManifest.xml :
<activity android:name=".activities.Activity2"
android:parentActivityName="com.example.appname.activities.Activity1">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.appname.activities.Activity1" />
</activity>
마지막으로 내 메뉴 (액션 바)의 액션 버튼 :
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
...
case android.R.id.home:
NavUtils.navigateUpFromSameTask(this);
return true;
}
return super.onOptionsItemSelected(item);
}
사용하는 NavUtils.navigateUpFromSameTask(this);
대신, 날 위해 일했습니다 finish()
.
나를 도왔고 다른 사람들에게 유용 할 수있는 것을 공유하는 것뿐입니다. 여기에있는 대부분의 답변은 정확하지만을 사용하면 getActionBar().setDisplayHomeAsUpEnabled(true);
저에게 효과적 이지 않았습니다. 내가 가진 문제는 수동으로 두 번째 활동을 만들려고했지만 더 자세한 내용이 관련되어 있다는 것입니다.
내 문제를 실제로 해결 한 것은 Android Studio 자체 도구를 사용하여 두 번째 활동을 만들기위한 Android 개발자 자습서 ( https://developer.android.com/training/basics/firstapp/starting-activity )를 따르는 것이 었습니다 .
Create the second activity
1. In the Project window, right-click the app folder and select New > Activity > Empty Activity.
2. In the Configure Activity window, enter "DisplayMessageActivity" for Activity Name and click Finish (leave all other properties set to the defaults).
Android Studio automatically does three things:
- Creates the DisplayMessageActivity file.
- Creates the corresponding activity_display_message.xml layout file.
- Adds the required <activity> element in AndroidManifest.xml.
단순히 onBackPressed()
onClick 리스너 를 넣을 수도 있습니다 . 이렇게하면 버튼이 Android 앱의 기본 "백업 / 업"버튼처럼 작동합니다!
Toolbar toolbar=findViewById(R.id.toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
if (getSupportActionBar()==null){
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getItemId()==android.R.id.home)
finish();
return super.onOptionsItemSelected(item);
}
이것은 나를 위해 일하고 있습니다 .. 두 개의 활동이 있다고 가정하십시오 (Activityone, Activitytwo)
Activitytwo 내부에서이 코드를 사용합니다.
@Override
protected void onCreate(Bundle savedInstanceState) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
Activityone에서
//when you need to go second activity
startActivity(new Intent(Activityone.this, Activitytwo.class));
이것은 매니페스트 파일 내의 두 번째 활동에 포함되어야합니다.
<activity android:name=".Activitytwo"
android:parentActivityName=".Activityone"></activity>
결과는 다음과 같습니다.
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.YourxmlFileName);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id==android.R.id.home) {
finish();
return true;
}
return false;
}
이것은 나를 위해 일하고 있습니다. getSupportActionBar (). setDisplayHomeAsUpEnabled (false); 여기에 이미지 설명 입력