Отображение стрелки назад на панели инструментов



Я мигрирую из ActionBar до Toolbar в моем приложении.
Но я не знаю, как отобразить и установить событие щелчка на Стрелке назад на Toolbar Как я сделал на Actionbar.



enter image description here



С ActionBar, Я называю mActionbar.setDisplayHomeAsUpEnabled(true).
Но нет подобного метода, как этот.



кто-нибудь сталкивался с этой ситуацией и как-то нашел способ ее решить?

591   13  

13 ответов:

если вы используете ActionBarActivity затем вы можете сказать, Android, чтобы использовать 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 панели инструментов. Android Doc

mToolBar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha);

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

я использовал этот метод от Документация Для Разработчиков 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>

Я надеюсь, что это поможет вам!

если вы не хотите создать пользовательскую 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> тег, для применения ко всем видам деятельности

enter image description here

если вы были используя 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>

в вашей активности Xml, если панель инструментов определена следующим образом:

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

тогда, и это важная часть, ты set панель действий поддержки для 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);
} 
    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"/>
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());
    }

это прекрасно работал

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

в файле манифеста для действия, где вы хотите добавить кнопку назад, мы будем использовать свойство android: parentActivityName

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

П. С. этот атрибут был введен на уровне API 16.

на 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;
    }

}

простой и легкий способ показать кнопку назад на панели инструментов

вставить этот код в метод 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);
}

Comments

    Ничего не найдено.