アプリケーションでからActionBar
に移行してToolbar
います。しかし、上のToolbar
ようにBack Arrowにクリックイベントを表示して設定する方法がわかりませんActionbar
。
でActionBar
、を呼び出しますmActionbar.setDisplayHomeAsUpEnabled(true)
。しかし、このような同様の方法はありません。
誰かがこの状況に直面し、どういうわけかそれを解決する方法を見つけたことがありますか?
アプリケーションでからActionBar
に移行してToolbar
います。しかし、上のToolbar
ようにBack Arrowにクリックイベントを表示して設定する方法がわかりませんActionbar
。
でActionBar
、を呼び出しますmActionbar.setDisplayHomeAsUpEnabled(true)
。しかし、このような同様の方法はありません。
誰かがこの状況に直面し、どういうわけかそれを解決する方法を見つけたことがありますか?
回答:
あなたが使用している場合ActionBarActivity
、あなたは使用するには、Androidを伝えることができるToolbar
ようActionBar
そのように:
Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar);
setSupportActionBar(toolbar);
そして次に呼び出す
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
働くでしょう。アタッチされているFragmentsでも使用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;
}
R.drawable.abc_ic_ab_back_mtrl_am_alpha
でしたR.drawable.ic_action_back
。どちらも見つかりません。
toolbar.setNavigationIcon(android.support.v7.appcompat.R.drawable.abc_ic_ab_back_material);
たくさんの答えが見られますが、これは以前に言及されていない私のものです。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);
}
onOptionItemSelected()
賛成票は、MrEngineer13が彼の回答でカバーしなかったことを完了します。
それを実現する方法はたくさんありますが、ここが私のお気に入りです。
レイアウト:
<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
}
});
setNavigationOnClickListener()
する代わりに、case android.R.id.home:
'onOptionsItemSelected() `内に追加できます。
case android.R.id.home
うまくいきませんでした。しばらく検索したところ、答えがうまくなりました。ありがとう。
ツールバーのsetNavigationIconメソッドを使用できます。 Androidドキュメント
mToolBar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha);
mToolBar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
handleOnBackPress();
}
});
setNavigationOnClickListener()
はAPIレベル21以降で追加されていることに注意してください
カスタムを作成したくない場合は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>
タグに付けて、すべてのアクティビティに適用することもできます
if (item.getItemId() == android.R.id.home)
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 Developer Documentationからこの方法を使用しました:
@Override
public void onCreate(Bundle savedInstanceState) {
...
getActionBar().setDisplayHomeAsUpEnabled(true);
}
nullポインタ例外が発生した場合、テーマに依存する可能性があります。マニフェストで別のテーマを使用するか、これを代わりに使用してください:
@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>
これがお役に立てば幸いです。
getSupportActionBar()
働いた。ありがとう!
あなたは場合にして使用してAppCompatActivity
、あなたが自動取得できないと思ったので、それを使用していないの道ダウンしているActionBar
、それが提供するあなたが析出したいので、Toolbar
、なぜならあなたの材料設計のニーズとのCoordinatorLayout
かAppBarLayout
、そして、このことを考慮してください。
引き続きを使用AppCompatActivity
でき<android.support.v7.widget.Toolbar>
ます。xmlでを使用できるようにするためだけに使用を停止する必要はありません。次のように、アクションバーのスタイルをオフにします。
まず、で好きなNoActionBarテーマの1つからスタイルを派生させます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>
アクティビティ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);
}
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());
}
ツールバーに戻るボタンを表示するシンプルで簡単な方法
このコードを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);
}
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
}
簡単にできます。
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
で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;
}
}
戻るボタンを追加するアクティビティのマニフェストファイルでは、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
}
});
}
}
まず、ツールバーを初期化する必要があります。
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
次にアクションバーから戻るボタンを呼び出します:
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
@Override
public boolean onSupportNavigateUp() {
onBackPressed();
return 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
}
これをレイアウトフォルダのアクティビティの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();
}
});
おそらく、テーマからアップアイコンを取得するためのより信頼性の高い方法(ツールバーをアクションバーとして使用していない場合):
toolbar.navigationIcon = context.getDrawableFromAttribute(R.attr.homeAsUpIndicator)
テーマ属性をドローアブルに変換するために、拡張関数を使用しました。
fun Context.getDrawableFromAttribute(attributeId: Int): Drawable {
val typedValue = TypedValue().also { theme.resolveAttribute(attributeId, it, true) }
return resources.getDrawable(typedValue.resourceId, theme)
}
使用している場合はDrawerLayoutをしてActionBarDrawerToggleし、表示するように戻るの代わりのボタンメニューボタン(およびその逆)を、あなたの活動にこのコードを追加する必要があります。
@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を、あなたが必要な場合は、メニューボタンを、呼び出しshowBackInToolbar(偽)。
ここに戻る矢印(ic_arrow_back_white_32dp)を生成できます。クリップアートセクションでarrow_backを検索します(デフォルトの32dpと8dpのパディングを使用)。ちょうどあなたが欲しい色を選択してください。
あなたはいつでも追加することができRelative layout
たり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)
JetPackナビゲーションを使用している場合。
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"/>
以下のように、アクティビティクラスの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()メソッドに以下のようにcallBackを作成します
val callback = requireActivity().onBackPressedDispatcher.addCallback(this) {
// Handle the back button event
}
ドキュメントから:https : //developer.android.com/guide/navigation/navigation-custom-back
あなたがandroidx.appcompat.app.AppCompatActivity
ちょうど使用している場合:
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
次にManifest.xml
、親アクティビティで定義します。
<activity
android:name=".MyActivity"
...>
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".ParentActivity" />
</activity>
代わりに、a Toolbar
を使用していてカスタム動作が必要な場合は、次のように使用します。
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
app:navigationIcon="?attr/homeAsUpIndicator"
.../>
そしてあなたの活動で:
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//....
}
});