Programming

툴바에 뒤로 화살표 표시

procodes 2020. 2. 16. 20:52
반응형

툴바에 뒤로 화살표 표시


응용 프로그램 에서에서 ActionBar마이그레이션 중입니다 Toolbar. 그러나 내가 Toolbar했던 것처럼 뒤로 화살표에 클릭 이벤트를 표시하고 설정하는 방법을 모르겠습니다 Actionbar.

여기에 이미지 설명을 입력하십시오

ActionBar전화 mActionbar.setDisplayHomeAsUpEnabled(true)합니다. 그러나 이와 비슷한 방법은 없습니다.

누구 든지이 상황에 직면하여 어떻게 든 해결할 수있는 방법을 찾았습니까?


를 사용하는 경우 ActionBarActivityAndroid에 Toolbar다음 ActionBar과 같이 사용하도록 지시 할 수 있습니다 .

Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar);
setSupportActionBar(toolbar);

그런 다음

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);

작동합니다. 당신은 또한 첨부 된 조각에서 ActionBarActivities이것을 사용할 수 있습니다 :

((ActionBarActivity) getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);
((ActionBarActivity) getActivity()).getSupportActionBar().setDisplayShowHomeEnabled(true);

사용하지 ActionBarActivities않거나 뒤로 화살표를 Toolbar설정하지 않은 SupportActionBar경우 다음을 사용할 수 있습니다.

mActionBar.setNavigationIcon(getResources().getDrawable(R.drawable.ic_action_back));
mActionBar.setNavigationOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
       //What to do on back clicked
   }
});

를 사용하는 경우 android.support.v7.widget.Toolbar다음 코드를 추가해야합니다 AppCompatActivity.

@Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return true;
}

나는 많은 답변을 보았지만 여기에 언급되지 않은 것이 있습니다. API 8 이상에서 작동합니다.

public class DetailActivity extends AppCompatActivity

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_detail);

    // toolbar
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    // add back arrow to toolbar
    if (getSupportActionBar() != null){
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
    }
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // handle arrow click here
    if (item.getItemId() == android.R.id.home) {
        finish(); // close this activity and return to preview activity (if there is any)
    }

    return super.onOptionsItemSelected(item);
}

그것을 달성하는 많은 방법이 있습니다, 여기 내가 가장 좋아하는 것이 있습니다 :

나열한 것:

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    app:navigationIcon="?attr/homeAsUpIndicator" />

활동:

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);

    toolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // back button pressed
        }
    });

툴바 setNavigationIcon 메소드를 사용할 수 있습니다. 안드로이드 닥

mToolBar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha);

mToolBar.setNavigationOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        handleOnBackPress();
    }
});

사용자 정의를 작성하지 않으려면 Toolbar다음과 같이하십시오.

public class GalleryActivity extends AppCompatActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        ...  
        getSupportActionBar().setTitle("Select Image");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == android.R.id.home) {
            finish();
        }
        return super.onOptionsItemSelected(item);
    }
}                     

당신 안에 AndroidManifest.xml

<activity
    android:name=".GalleryActivity"
    android:theme="@style/Theme.AppCompat.Light">        
</activity>

당신은이를 넣을 수 있습니다 android:theme="@style/Theme.AppCompat.Light"<aplication>모든 활동에 적용을 위해, 태그

여기에 이미지 설명을 입력하십시오


    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    toolbar.setNavigationIcon(R.drawable.back_arrow); // your drawable
    toolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            onBackPressed(); // Implemented by activity
        }
    });

API 21 이상 android:navigationIcon

<android.support.v7.widget.Toolbar
    android:navigationIcon="@drawable/back_arrow"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"/>

Google 개발자 문서 에서이 방법을 사용했습니다 .

@Override
public void onCreate(Bundle savedInstanceState) {
  ...
  getActionBar().setDisplayHomeAsUpEnabled(true);
}

널 포인터 예외가 발생하면 테마에 따라 달라질 수 있습니다. 매니페스트에서 다른 테마를 사용해 보거나 대신 사용하십시오.

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

그런 다음 매니페스트에서 현재 활동에 대한 부모 활동을 설정합니다.

<activity
        android:name="com.example.myapp.MyCurrentActivity"
        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.myapp.MyMainActivity" />
</activity>

이것이 당신을 도울 수 있기를 바랍니다!


당신이 경우 사용 AppCompatActivity하고 자동하지 싶었 기 때문에, 사용하지 않을의 경로 아래로 갔다 ActionBar가 제공하는 당신이 밖으로 분리를 원하기 때문에, Toolbar때문에 당신의 재료 설계의 요구와의 CoordinatorLayout또는 AppBarLayout, 다음, 이것을 고려 :

당신은 여전히을 사용할 수 있으며 AppCompatActivity, <android.support.v7.widget.Toolbar>XML에서을 사용할 수 있도록 사용을 중단 할 필요는 없습니다 . 다음과 같이 작업 표시 줄 스타일끄십시오 .

먼저, 당신은 당신처럼하는 NoActionBar 테마 중 하나에서 스타일을 도출 styles.xml, 내가 사용 Theme.AppCompat.Light.NoActionBar과 같이 :

<style name="SuperCoolAppBarActivity" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/primary</item>

    <!-- colorPrimaryDark is used for the status bar -->
    <item name="colorPrimaryDark">@color/primary_dark</item>
    ...
    ...
</style>

앱 매니페스트에서 방금 정의한 자식 스타일 테마를 다음과 같이 선택하십시오.

    <activity
        android:name=".activity.YourSuperCoolActivity"
        android:label="@string/super_cool"
        android:theme="@style/SuperCoolAppBarActivity">
    </activity>

Activity Xml에서 툴바가 다음과 같이 정의 된 경우 :

...
    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        />
...

그런 다음이 부분이 중요 합니다. 지원 작업 표시 줄을 확장중인 AppCompatActivity로 설정 하면 XML의 도구 모음 작업 표시 줄이됩니다. 사용자 지정 클릭 핸들러 등을 추가하지 않고도 메뉴, 자동 활동 제목, 항목 선택 처리 등과 같이 ActionBar가 허용하는 많은 작업을 간단하게 수행 할 수 있기 때문에 이것이 더 좋은 방법이라고 생각합니다.

활동의 onCreate 재정의에서 다음을 수행하십시오.

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_super_cool);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);

    setSupportActionBar(toolbar);
    //Your toolbar is now an action bar and you can use it like you always do, for example:
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
} 

툴바에 간단하고 쉬운 뒤로 버튼 표시

이 코드를 onCreate 메소드에 붙여 넣기

 if (getSupportActionBar() != null){

            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            getSupportActionBar().setDisplayShowHomeEnabled(true);
        }

이 재정의 메소드를 onCreate 메소드 외부에 붙여 넣기

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if(item.getItemId()== android.R.id.home) {

        finish();
    }
    return super.onOptionsItemSelected(item);
}

MyActivity extends AppCompatActivity {

    private Toolbar toolbar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        toolbar = (Toolbar) findViewById(R.id.my_toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        toolbar.setNavigationOnClickListener(arrow -> onBackPressed());
    }

에서 AppCompatActivity예를 들어, 당신은 할 수

public class GrandStatActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_grand_stat);
    }

    @Override
    public void onResume() {
        super.onResume();

        // Display custom title
        ActionBar actionBar = this.getSupportActionBar();
        actionBar.setTitle(R.string.fragment_title_grandstats);

        // Display the back arrow
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
    }

    // Back arrow click event to go to the parent Activity
    @Override
    public boolean onSupportNavigateUp() {
        onBackPressed();
        return true;
    }

}

쉽게 할 수 있습니다.

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
@Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return true;
}

크레딧 : https://freakycoder.com/android-notes-24-how-to-add-back-button-at-toolbar-941e6577418e


뒤로 버튼을 추가하려는 활동의 매니페스트 파일에서 android : parentActivityName 속성을 사용합니다 .

        <activity
        android:name=".WebActivity"
        android:screenOrientation="portrait"
        android:parentActivityName=".MainActivity"
        />

PS 이 속성은 API 레벨 16에서 도입되었습니다.


이것은 완벽하게 작동했습니다

public class BackButton extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.chat_box);
        Toolbar chatbox_toolbar=(Toolbar)findViewById(R.id.chat_box_toolbar);
        chatbox_toolbar.setTitle("Demo Back Button");
        chatbox_toolbar.setTitleTextColor(getResources().getColor(R.color.white));
        setSupportActionBar(chatbox_toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
        chatbox_toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //Define Back Button Function
            }
        });
    }
}

코 틀린에서는

private fun setupToolbar(){
    toolbar.title = getString(R.string.YOUR_TITLE)
    setSupportActionBar(toolbar)
    supportActionBar?.setDisplayHomeAsUpEnabled(true)
    supportActionBar?.setDisplayShowHomeEnabled(true)
}

// don't forget click listener for back button
override fun onSupportNavigateUp(): Boolean {
    onBackPressed()
    return true
}

이것을 레이아웃 폴더의 액티비티 xml에 추가하십시오.

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay">
    <android.support.v7.widget.Toolbar
        android:id="@+id/prod_toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:popupTheme="@style/AppTheme.PopupOverlay" />
</android.support.design.widget.AppBarLayout>

툴바를 클릭 가능하게 만들고 onCreate 메소드에 다음을 추가하십시오.

Toolbar toolbar = (Toolbar) findViewById(R.id.prod_toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        finish();
    }
});

당신이 사용하는 경우 DrawerLayoutActionBarDrawerToggle을 다음 보여 뒤로 대신 버튼 메뉴 , 당신이 당신의 활동에이 코드를 추가 할 필요가 버튼 (및 viceversa에를)

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // ...

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.application_name, R.string.application_name);
    mDrawerLayout.addDrawerListener(mDrawerToggle);

    mDrawerToggle.setHomeAsUpIndicator(R.drawable.ic_arrow_back_white_32dp);
    mDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            onBackPressed(); // Or you can perform some other action here when Back button is clicked.
        }
    });
    mDrawerToggle.syncState();
    // ...
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (mDrawerToggle.onOptionsItemSelected(item))
        return true;

    switch (item.getItemId()) {
        case android.R.id.home:
            onBackPressed();
            return true;
        // ...
    }

    return super.onOptionsItemSelected(item);
}

public void showBackInToolbar(boolean isBack) {
    // Remove next line if you still want to be able to swipe to show drawer menu.
    mDrawerLayout.setDrawerLockMode(isBack ? DrawerLayout.LOCK_MODE_LOCKED_CLOSED : DrawerLayout.LOCK_MODE_UNLOCKED);
    mDrawerToggle.setDrawerIndicatorEnabled(!isBack);
    mDrawerToggle.syncState();
}

따라서 메뉴 버튼 대신 뒤로 버튼 을 표시해야 할 경우 showBackInToolbar (true)를 호출 하고 메뉴 버튼 이 필요한 경우 showBackInToolbar (false)를 호출 하십시오 .

여기 에서 뒤로 화살표 (ic_arrow_back_white_32dp) 생성 하고 클립 아트 섹션 에서 arrow_back검색 할 수 있습니다 ( 8dp 패딩에서 기본 32dp 사용). 원하는 색상을 선택하십시오.


언제든지 a Relative layout또는 a Linear Layout추가하고 원하는대로 Toolbar뒤로 아이콘 또는 닫기 아이콘의 이미지보기를 툴바의 아무 곳에 나 배치 할 수 있습니다

예를 들어 툴바에서 상대적 레이아웃을 사용했습니다.

 <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar_top"
                android:layout_width="match_parent"
                android:layout_height="35dp"
                android:minHeight="?attr/actionBarSize"
                android:nextFocusDown="@id/netflixVideoGridView"
                app:layout_collapseMode="pin">

                <RelativeLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content">


                    <TextView

                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="Myflix"
                        android:textAllCaps="true"
                        android:textSize="19sp"
                        android:textColor="@color/red"
                        android:textStyle="bold" />


                    <ImageView
                        android:id="@+id/closeMyFlix"
                        android:layout_alignParentRight="true"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_gravity="center_vertical"
                        app:srcCompat="@drawable/vector_close" />


                </RelativeLayout>

            </android.support.v7.widget.Toolbar>

그리고 다음과 같이 보입니다 :

여기에 이미지 설명을 입력하십시오

해당 이미지보기에서 클릭 리스너를 활동 또는 이와 같은 조각으로 추가 할 수 있습니다.

  closeMyFlix.setOnClickListener({
            Navigator.instance.showFireTV(  activity!!.supportFragmentManager)
        })

Kotlin은 다음과 같이되었습니다.

Xml :

<include
android:id="@+id/tbSignToolbar "
layout="@layout/toolbar_sign_up_in"/>

당신의 활동에서 :-

setSupportActionBar(tbSignToolbar as Toolbar?)//tbSignToolbar :id of your toolbar 
supportActionBar?.setDisplayHomeAsUpEnabled(true)
supportActionBar?.setDisplayShowHomeEnabled(true)

SupportActionBar로 설정되지 않은 툴바에 뒤로 화살표를 표시하려면 다음을 수행하십시오.

(코트 린)

val resId = getResIdFromAttribute(toolbar.context, android.R.attr.homeAsUpIndicator)
toolbarFilter.navigationIcon = ContextCompat.getDrawable(toolbar.context, resId)
toolbarFilter.setNavigationOnClickListener { fragmentManager?.popBackStack() }

속성에서 입술을 얻으려면 :

@AnyRes
fun getResIdFromAttribute(context: Context, @AttrRes attr: Int): Int {
    if (attr == 0) return 0
    val typedValueAttr = TypedValue()
    context.theme.resolveAttribute(attr, typedValueAttr, true)
    return typedValueAttr.resourceId
}

JetPack Navigation을 사용하는 경우

MainActivity의 레이아웃은 다음과 같습니다.

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
                                               xmlns:app="http://schemas.android.com/apk/res-auto"
                                               xmlns:tools="http://schemas.android.com/tools"
                                               android:layout_width="match_parent"
                                               android:layout_height="match_parent"
                                               tools:context=".MainActivity">

<androidx.appcompat.widget.Toolbar
        android:id="@+id/toolBar"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

</androidx.appcompat.widget.Toolbar>

<fragment
        android:id="@+id/my_nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:defaultNavHost="true"
        app:layout_constraintTop_toBottomOf="@id/toolBar"
        app:layout_constraintBottom_toTopOf="parent"
        app:navGraph="@navigation/nav_graph"/>

Activity 클래스의 onCreate ()에서 아래와 같이 활동에 툴바를 설정하십시오.

val navHostFragment = supportFragmentManager
        .findFragmentById(R.id.my_nav_host_fragment) as NavHostFragment? ?: return

val navController = navHostFragment.findNavController()
val toolBar = findViewById<Toolbar>(R.id.toolBar)
setSupportActionBar(toolBar) // To set toolBar as ActionBar
setupActionBarWithNavController(navController)

setupActionBarWithNavController (navController) 필요한 경우 툴바에 뒤로 버튼을 만들고 backButton 기능을 처리합니다. CustomBack 기능을 작성해야하는 경우 단편 onCreate () 메소드에서 아래와 같이 콜백을 작성하십시오.

val callback = requireActivity().onBackPressedDispatcher.addCallback(this) {
        // Handle the back button event
    }

설명서에서 : https://developer.android.com/guide/navigation/navigation-custom-back

참고 URL : https://stackoverflow.com/questions/26651602/display-back-arrow-on-toolbar


반응형