developer tip

Android-제목 표시 줄의 뒤로 버튼

copycodes 2020. 8. 31. 08:00
반응형

Android-제목 표시 줄의 뒤로 버튼


많은 앱 (캘린더, 드라이브, Play 스토어)에서 버튼을 탭하고 새로운 활동을 입력하면 제목 표시 줄의 아이콘이 뒤로 버튼으로 바뀌지 만 제가 만들고있는 앱에서는 그렇게하지 않습니다. 이 아이콘을 어떻게 이전 화면으로 되돌릴 수 있습니까?


제목 표시 줄에 뒤로 버튼을 만드는 간단한 두 단계가 있습니다.

먼저 제목 표시 줄에 뒤로 버튼을 추가하려는 활동에서 다음 코드를 사용하여 애플리케이션 아이콘을 클릭 할 수 있도록합니다.

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();
    }

마침내 액션 바 / 툴바에 뒤로 버튼을 제대로 추가했습니다.

@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>

상위 활동 지정을 참조하십시오.


Google에서 설명하는 가장 간단한 방법과 모범 사례는 다음 과 같습니다 .

1. 다음에서 childActivity의 부모를 추가합니다 AndroidManifest.xml.

<activity 
        android:name=".ChildActivity"
        android:parentActivityName=".ParentActivity" >
</activity>

2. childActivity에서 뒤로 버튼을 활성화합니다.

myActionOrActionSupportBar.setDisplayHomeAsUpEnabled(true);

나를 위해 일했고, 당신에게도 효과가 있기를 바랍니다.


우선 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);

건배.


먼저이 코드를 작성해야합니다.

@Override
    protected void onCreate(Bundle savedInstanceState) {
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

그런 다음 매니페스트에이 줄을 추가합니다.

 <activity android:name=".MainActivity"
            android:parentActivityName=".PreviousActivity"></activity>

나는 그것이 작동 할 것이라고 생각한다


활동이 확장되면 다음 과 같이 메서드 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()하면 전화기의 뒤로 단추와 도구 모음의 화살표가 동일한 작업을 수행합니다.


사용하지 않는 경량 버전 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.


ActionBar를 사용하는 경우 http://developer.android.com/reference/android/app/ActionBar.html#setDisplayHomeAsUpEnabled(boolean) 문서를 읽고 싶을 것입니다.

그런 다음 onOptionsItemSelected (MenuItem) 메서드를 덮어 쓰고 android.R.id.home 이벤트가 들어 오도록해야합니다. 그런 다음 사용자가 작업 표시 줄에서 뒤로 버튼을 클릭했음을 알 수 있습니다.


매니페스트 파일에 아래 언급 된 코드를 추가해야합니다. 뒤로 화살표 기능을 추가 할 활동을 검색합니다. 하나를 찾으면 괜찮거나 활동을 만드십시오.

<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");
    }

이것이 제가 문제를 해결 한 방법입니다. 감사.


내 앱에는 언제든지 돌아갈 수있는 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);
        }
    }

on 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>

and finally, the action button on my menu (actionbar):

public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            ...

            case android.R.id.home:
                NavUtils.navigateUpFromSameTask(this);
                return true;

        }

        return super.onOptionsItemSelected(item);

    }

Using NavUtils.navigateUpFromSameTask(this); worked for me, instead of finish().


You can also simply put onBackPressed() in your onClick listener. This causes your button to act like the default "back/up" buttons in android apps!


It can also be done without code by specifying a parent activity in app manifest If you want a back button in Activity B which will goto Activity A, just add Activity A as the parent of Activity B in the manifest.


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);
}

This is working for me.. Suppose there are two activity (Activityone,Activitytwo)

Inside Activitytwo use this code

@Override
protected void onCreate(Bundle savedInstanceState) {
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

On Activityone

//when you need to go second activity
startActivity(new Intent(Activityone.this, Activitytwo.class));

This should be included in second activity inside manifest file

<activity android:name=".Activitytwo"
        android:parentActivityName=".Activityone"></activity>

And The result would be like this

여기에 이미지 설명 입력


For kotlin :

   override fun onOptionsItemSelected(item: MenuItem): Boolean {
        onBackPressed();
        return true;
    }

The other answers don't mention that you can also set this in the XML of your Toolbar widget:

app:navigationIcon="?attr/homeAsUpIndicator"

For example:

<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" />

Just sharing something that helped me and may be useful for others. Although most of the answers here are correct, by using the getActionBar().setDisplayHomeAsUpEnabled(true);, this wasn't working for me. The issue I had was that I was trying to create a second Activity manually, but there are more details involved.
What really solved my problem was following Android Developers tutorial (https://developer.android.com/training/basics/firstapp/starting-activity) for creating a second Activity using Android Studio own tools:

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.

This is working for me getSupportActionBar().setDisplayHomeAsUpEnabled(false); enter image description here

참고 URL : https://stackoverflow.com/questions/14545139/android-back-button-in-the-title-bar

반응형

'developer tip' 카테고리의 다른 글

Eclipse 시작시 SDK로드 오류  (0) 2020.08.31
AdMob 용 기기 ID는 어떻게받을 수 있나요?  (0) 2020.08.31
Xcode 8 cocoapods 중단 트랩 : 6  (0) 2020.08.31
비트 연산 및 사용  (0) 2020.08.31
jQuery 추가 페이드 인  (0) 2020.08.31