在getSupportActionBar()中获取空指针

时间:2016-06-20 10:44:45

标签: android toolbar

这是我的BaseActivity类,将由其他活动扩展。

import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.SearchView;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageButton;
import android.widget.Toast;

import com.bidhee.jme.R;
import com.bidhee.jme.controller.bus_and_events.EventBus;
import com.bidhee.jme.controller.bus_and_events.Events;
import com.bidhee.jme.model.SearchViewModel;
import com.bidhee.jme.utils.Metadata;
import com.bidhee.jme.utils.UtilityMethods;

import butterknife.Bind;
import butterknife.ButterKnife;

/**
 * Created by ronem on 6/5/16.
 */
public abstract class BaseActivity extends AppCompatActivity {
    private String TAG = getClass().getSimpleName();
    @Bind(R.id.toolbar)
    Toolbar toolbar;

    public SearchView searchView;

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

        /**
         * Bind {@link ButterKnife}
         */
        ButterKnife.bind(this);
        EventBus.register(this);

        /**
         * Setting toolbar in the place of actionbar
         * and enabling the back arrow on it so that use can go back to the previous activity
         */
        setSupportActionBar(toolbar);

        assert getSupportActionBar() != null;
        if (getSupportActionBar() != null) {
            this.getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            this.getSupportActionBar().setHomeButtonEnabled(true);
        }


        /**
         * Loop through all the child's of toolbar
         * and change the attributes value
         */
        if (getActivityId() != 0) {
            if (toolbar != null) {
                for (int i = 0; i < toolbar.getChildCount(); i++) {
                    View view = toolbar.getChildAt(i);
                    if (view instanceof ImageButton) {
                        ImageButton tv = (ImageButton) view;
                        tv.setColorFilter(Color.WHITE);
                    }
                }
            }
        }


        /**
         * If getActivityId matches with the {@link Metadata.DASHBOARD_ID}
         * set actionbar title to empty
         * change the navigation icon to custom icon
         * and background of the action bar to transparent
         *
         */
        if (getActivityId() == Metadata.DASHBOARD_ID) {
            if (getSupportActionBar() != null) {
                this.getSupportActionBar().setHomeAsUpIndicator(R.mipmap.ic_person_outline_black_24dp);
                this.getSupportActionBar().setBackgroundDrawable(new ColorDrawable(getResources().getColor(R.color.transparent)));
            }
        }

        if (getSupportActionBar() != null)
            getSupportActionBar().setTitle(getActivityTitle());

        /**
         * change the status bar color
         */
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            getWindow().setStatusBarColor(getResources().getColor(R.color.colorPrimaryDark));
        }
    }

    //returns layout resource
    public abstract int getResourceLayout();

    //returns Activity's ID
    public abstract int getActivityId();

    //returns Activity Title
    public abstract String getActivityTitle();


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        getMenuInflater().inflate(R.menu.menu_japan_money_express, menu);

        //setting all menu items tint color to white
        UtilityMethods.setTintColorForMenuItems(menu);

        //referencing to search menu item
        MenuItem menuItem = menu.findItem(R.id.action_search);
        searchView = (SearchView) menuItem.getActionView();
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {

                EventBus.post(new Events.SearchViewEvent(new SearchViewModel(newText)));
                return false;
            }
        });

        if (getActivityId() == Metadata.DASHBOARD_ID) {

            //show only chat notification icon on toolbar menu and hide rest of the items of toolbar
            showMenu(menu, 0);

        } else if (getActivityId() == Metadata.MONEY_TRANSFER_INITIAL_ID) {

            //show only search view icon on toolbar menu and hide rest of the items of toolbar
            showMenu(menu, 1);
        } else {
            hideAllMenu(menu);
        }

        return super.onCreateOptionsMenu(menu);

    }

    private void hideAllMenu(Menu menu) {
        for (int i = 0; i < menu.size(); i++) {
            menu.getItem(i).setVisible(false);
            menu.getItem(i).setVisible(false);
        }
    }

    private void showMenu(Menu menu, int position) {
        for (int i = 0; i < menu.size(); i++) {
            if (position == i) {
                menu.getItem(i).setVisible(true);
            } else {
                menu.getItem(i).setVisible(false);
            }
        }
    }

    /**
     * Overriding the onOptionItemSelected so that we can access the actions of the actionbar
     *
     * @param item
     * @return
     */
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                if (getActivityId() == Metadata.DASHBOARD_ID) {
                    Toast.makeText(getApplicationContext(), "user info under constrction", Toast.LENGTH_SHORT).show();
                } else {
                    this.finish();
                }

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

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        overridePendingTransition(R.anim.zoom_in_from_top_left_to_bottom_right, R.anim.slide_down_dialog);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        /**
         * must unbind the ButterKnife on Destroy
         */
        ButterKnife.unbind(this);
        EventBus.unregister(this);

    }
}

并且有超过3个活动将扩展此基类活动。其中之一是这个。

CheckRateActivity.java

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.bidhee.jme.R;
import com.bidhee.jme.controller.bus_and_events.Events;
import com.bidhee.jme.model.CountryModel;
import com.squareup.otto.Subscribe;

import butterknife.Bind;
import butterknife.OnClick;

/**
 * Created by ronem on 6/13/16.
 */
public class CheckRateActivity extends BaseActivity {
    private String TAG = getClass().getSimpleName();

    @Bind(R.id.sendingFromLayout)
    LinearLayout sendingFromLayout;
    @Bind(R.id.sendingtoLayout)
    LinearLayout sendingToLayout;

    CountryModel country;
    ImageView fromCountryFlag, toCountryFlag;
    TextView fromCountryTitle, toCountryTitle;
    View arrowDownTo;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        fromCountryFlag = (ImageView) sendingFromLayout.findViewById(R.id.row_image);
        fromCountryTitle = (TextView) sendingFromLayout.findViewById(R.id.row_title);

        fromCountryFlag.setImageResource(R.drawable.jamaica);
        fromCountryTitle.setText("Jamaica");

        toCountryFlag = (ImageView) sendingToLayout.findViewById(R.id.row_image);
        toCountryTitle = (TextView) sendingToLayout.findViewById(R.id.row_title);
        arrowDownTo = (View) sendingToLayout.findViewById(R.id.arrow_down_view);
        arrowDownTo.setVisibility(View.VISIBLE);

    }

    @Override
    public int getResourceLayout() {
        return R.layout.check_rate_layout;
    }

    @Override
    public int getActivityId() {
        return 0;
    }

    @Override
    public String getActivityTitle() {
        return "Check rates";
    }

    @OnClick(R.id.sendingtoLayout)
    public void onSendinToLayoutClicked() {

        Intent intent = new Intent(CheckRateActivity.this, SelectCountryListActivity.class);
        startActivity(intent);
    }


    @Subscribe
    public void getCountry(Events.CountryModelEvent _country) {
        if (_country != null) {
            Log.d(TAG, _country.getCountryModel().toString());
            country = _country.getCountryModel();

            toCountryFlag.setImageResource(country.getCountryIcon());
            toCountryTitle.setText(country.getCountryName());

            Intent intent = new Intent(CheckRateActivity.this, MakeTransferActivity.class);
//            Bundle bundle = new Bundle();
//            bundle.putString(Metadata.COUNTRY_ID, c.getId());
//            bundle.putString(Metadata.COUNTRY_NAME, c.getCountryName());
//            bundle.putInt(Metadata.COUNTRY_FLAG, c.getCountryIcon());
//
//            intent.putExtras(bundle);

            Bundle box = new Bundle();
            box.putParcelable("country", country);
            intent.putExtras(box);
            startActivity(intent);
        }
    }


}

这是我的AndroidManifest.xml文件内容

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.bidhee.jme">

    <supports-screens
        android:anyDensity="true"
        android:largeScreens="true"
        android:normalScreens="true"
        android:smallScreens="true"
        android:xlargeScreens="true" />

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    <application
        android:name=".controller.AppController"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:largeHeap="true"
        android:launchMode="singleTask"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".views.activities.JapanMoneyExpress"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity
            android:name=".views.activities.Dashboard"
            android:label="@string/dashboard"
            android:screenOrientation="portrait" />

        <activity
            android:name=".views.activities.RegisterNewAccount"
            android:screenOrientation="portrait" />
        <activity
            android:name=".views.activities.CheckRateActivity"
            android:screenOrientation="portrait" />
        <activity
            android:name=".views.activities.SelectCountryListActivity"
            android:screenOrientation="portrait" />
        <activity
            android:name=".views.activities.MakeTransferActivity"
            android:screenOrientation="portrait" />

    </application>

</manifest>

这些是样式

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="android:windowBackground">@color/white</item>
    <!--<item name="colorControlHighlight">@color/white</item>-->
    <item name="colorAccent">@color/colorAccent</item>
</style>

<style name="AppTheme.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>

App大部分时间都运行平稳,但有时我在getSupportActionBar()中得到NullpointerException。所以我使用了StackOverflow中建议的这段代码。

assert getSupportActionBar() != null;
        if (getSupportActionBar() != null) {
            this.getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            this.getSupportActionBar().setHomeButtonEnabled(true);
        }

现在应用程序运行,但有一段时间我无法在工具栏中看到任何标题和后退箭头主页键。 我坚持了这个超过1天。

1 个答案:

答案 0 :(得分:1)

将基本活动的主题设置为以下

<activity
            android:name=".views.activities.JapanMoneyExpress"
             android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar"></activity>

风格如下

<style name="AppTheme.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
    </style>

现在在您的活动中,为了取回按钮和标题

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_xml);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeButtonEnabled(true);
        setTitle("Activity Title");
     }