Android工具栏崩溃了

时间:2015-12-15 18:28:01

标签: android crash toolbar

我正在尝试更改com.divyeshbc编写的代码,这是我从GitHub中提取的。原始代码在main_activity中设置工具栏并使用图标填充它。我想将此代码重新打包为一个单独的类,以便在单击按钮时可以将工具栏弹出为对话框。我有2个直接问题。

1:类型" android.support.v7.widget.Toolbar"未被识别为"工具栏"。我必须专门为findViewById()投射所有变量才能工作。崩溃发生在SlidingTab.initialize()," findViewById(R.id.toolbar)"中。查找失败,程序崩溃。

2 :(工具栏)FindViewById(R.id.toolbar)在main_activity中工作正常,但在主活动调用的方法中没有。我已经尝试强制setContentView()到一个我知道持有id的视图但它没有帮助。当查找失败时,程序崩溃。

我正在使用最新的Android IDE(我认为是1.5)和最新的SDK。我被困 - 我很感激任何意见和建议。

这是我的主要活动

package com.divyeshbc.slidingscrollbar;

import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.style.ImageSpan;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.support.v7.widget.Toolbar;

import com.divyeshbc.slidingscrollbar.tabs.SlidingTabLayout;
import com.divyeshbc.slidingscrollbar.SlidingTab;


public class
    MainActivity extends BaseActivity {

public ViewPager mPager;
public SlidingTabLayout mTabs;
public SlidingTab mSlidingTab;
public android.support.v7.widget.Toolbar mToolbar;

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

    setContentView(R.layout.sliding_tab);
    if (mToolbar != null) {
        //Use current toolbar
        setSupportActionBar(mToolbar);
    } else {
        mToolbar = (android.support.v7.widget.Toolbar) findViewById(R.id.toolbar);
    }


    mSlidingTab = new SlidingTab();
    mSlidingTab.initialize();

    mTabs = mSlidingTab.getSlidingTabLayout();
    mPager = mSlidingTab.getViewPager();

    //setContentView(R.layout.sliding_tab);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

class MyPagerAdapter extends FragmentPagerAdapter {

    //Setting up integer array of icons
    int icons[] = {R.drawable.about_us, R.drawable.campus, R.drawable.events, R.drawable.learning, R.drawable.sewa};

    //Defined from strings.xml
    String[] tabText = getResources().getStringArray(R.array.tabs);

    public MyPagerAdapter(FragmentManager fm) {
        super(fm);
        //Initialising the strings array of tabs
        tabText = getResources().getStringArray(R.array.tabs);
    }

    @Override
    public Fragment getItem(int position) {

        //Initialising Fragment
        //Passing in the position so that position of the fragment is returned
        MyFragment myFragment = MyFragment.getInstance(position);

        return myFragment;
    }

    @Override
    public CharSequence getPageTitle(int position) {

        //Constructing drawable object from the icon position
        Drawable drawable = getResources().getDrawable(icons[position]);

        //Defining the bounds for each icon as this is not automatically calculated
        drawable.setBounds(0, 0, 90, 90);

        //Passing icons as drawable objects into the imageSpan. This means it can be placed amongst the text
        ImageSpan imageSpan = new ImageSpan(drawable);

        //Spannable strings allows us to embed images with text (attach/detach images)
        SpannableString spannableString = new SpannableString(" ");

        //Here setting the span of the icons amongst the scroll bar. Using the array of icons, starting at position 0,
        //till the end, SPAN_EXCLUSIVE_EXCLUSIVE will ensure only the images in the range are included, nothing more,
        //nothing less
        spannableString.setSpan(imageSpan, 0, spannableString.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

        //Return the spannable string with icons embedded
        return spannableString;
    }

    @Override
    public int getCount() {
        return 5;
    }
}

public static class MyFragment extends Fragment {

    private TextView textView;

    //Method to return instance of the fragment. Passing in position to show which position is currently being shown in the fragment
    public static MyFragment getInstance(int position) {
        //Construct the fragment
        MyFragment myFragment = new MyFragment();

        //New bundle instance
        Bundle args = new Bundle();

        //Passing in the Integer position of the fragment into the argument
        args.putInt("position", position);

        //Setting the argument of the fragment to be the position
        myFragment.setArguments(args);

        //Return the fragment
        return myFragment;
    }

    @Override
    //This will handle how the fragment will display content
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle saveInstanceState) {
        //Inflate the fragment_main layout
        View layout = inflater.inflate(R.layout.fragment_main, container, false);

        //Initialising the text view
        textView = (TextView) layout.findViewById(R.id.position);

        //Getting a reference to the TextView (as defined in fragment_main) and set it to a value
        Bundle bundle = getArguments();

        //Safety Check
        if (bundle != null) {
            textView.setText("The page currently selected is " + bundle.getInt("position"));
        }

        return layout;
    }
}
}

,这是我的主要滑动标签类:

package com.divyeshbc.slidingscrollbar;

import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.style.ImageSpan;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.support.v7.widget.Toolbar;

import com.divyeshbc.slidingscrollbar.tabs.SlidingTabLayout;

public class
    SlidingTab extends AppCompatActivity {

public ViewPager mPager;
public SlidingTabLayout mTabs;
public android.support.v7.widget.Toolbar mToolbar;

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

    //Calling Activate Toolbar method
    //mToolbar = activateToolBar();

    if (mToolbar != null) {
        //Use current toolbar
        setSupportActionBar(mToolbar);
    } else {
        mToolbar = (android.support.v7.widget.Toolbar) findViewById(R.id.toolbar);
    }


    mPager = (ViewPager) findViewById(R.id.pager);
    //Setting the Adapter on the view pager first. Passing the fragment manager through as an argument
    mPager.setAdapter(new MyPagerAdapter(getSupportFragmentManager()));
    mTabs = (SlidingTabLayout) findViewById(R.id.tabs);

    //Setting the custom Tab View as the Sliding Tabs Layout
    mTabs.setCustomTabView(R.layout.custom_tab_view, R.id.tabText);

    mTabs.setDistributeEvenly(true);
         //mTabs.setSelectedIndicatorColors(getResources().
                     //getColor(R.color.tabIndicatorColour));

    mTabs.setBackgroundColor(getResources().getColor(R.color.basePrimaryBackgroundColour));

    //Setting the ViewPager as the tabs
    mTabs.setViewPager(mPager);

}

public void initialize() {

    if (mToolbar != null) {
        //Use current toolbar
        setSupportActionBar(mToolbar);
    } else {
        mToolbar = (android.support.v7.widget.Toolbar)
 findViewById(R.id.toolbar);
    }

    mPager = (ViewPager) findViewById(R.id.pager);
    //Setting the Adapter on the view pager first. Passing the fragment manager through as an argument
    mPager.setAdapter(new MyPagerAdapter(getSupportFragmentManager()));
    mTabs = (SlidingTabLayout) findViewById(R.id.tabs);

    //Setting the custom Tab View as the Sliding Tabs Layout
    mTabs.setCustomTabView(R.layout.custom_tab_view, R.id.tabText);

    mTabs.setDistributeEvenly(true);

    //mTabs.setSelectedIndicatorColors(getResources().getColor(R.color.tabIndicatorColour));

    mTabs.setBackgroundColor(getResources().getColor(R.color.basePrimaryBackgroundColour));

    //Setting the ViewPager as the tabs
    mTabs.setViewPager(mPager);

}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

public SlidingTabLayout getSlidingTabLayout() {
    return mTabs;
}

public ViewPager getViewPager() {
    return mPager;
}

class MyPagerAdapter extends FragmentPagerAdapter {

    //Setting up integer array of icons
    int icons[] = {R.drawable.about_us, R.drawable.campus, R.drawable.events, R.drawable.learning, R.drawable.sewa};

    //Defined from strings.xml
    String[] tabText = getResources().getStringArray(R.array.tabs);

    public MyPagerAdapter(FragmentManager fm) {
        super(fm);
        //Initialising the strings array of tabs
        tabText = getResources().getStringArray(R.array.tabs);
    }

    @Override
    public Fragment getItem(int position) {

        //Initialising Fragment
        //Passing in the position so that position of the fragment is returned
        MyFragment myFragment = MyFragment.getInstance(position);

        return myFragment;
    }

    @Override
    public CharSequence getPageTitle(int position) {

        //Constructing drawable object from the icon position
        Drawable drawable = getResources().getDrawable(icons[position]);

        //Defining the bounds for each icon as this is not automatically calculated
        drawable.setBounds(0, 0, 90, 90);

        //Passing icons as drawable objects into the imageSpan. This means it can be placed amongst the text
        ImageSpan imageSpan = new ImageSpan(drawable);

        //Spannable strings allows us to embed images with text (attach/detach images)
        SpannableString spannableString = new SpannableString(" ");

        //Here setting the span of the icons amongst the scroll bar. Using the array of icons, starting at position 0,
        //till the end, SPAN_EXCLUSIVE_EXCLUSIVE will ensure only the images in the range are included, nothing more,
        //nothing less
        spannableString.setSpan(imageSpan, 0, spannableString.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

        //Return the spannable string with icons embedded
        return spannableString;
    }

    @Override
    public int getCount() {
        return 5;
    }
}

public static class MyFragment extends Fragment {

    private TextView textView;

    //Method to return instance of the fragment. Passing in position to show which position is currently being shown in the fragment
    public static MyFragment getInstance(int position) {
        //Construct the fragment
        MyFragment myFragment = new MyFragment();

        //New bundle instance
        Bundle args = new Bundle();

        //Passing in the Integer position of the fragment into the argument
        args.putInt("position", position);

        //Setting the argument of the fragment to be the position
        myFragment.setArguments(args);

        //Return the fragment
        return myFragment;
    }

    @Override
    //This will handle how the fragment will display content
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle saveInstanceState) {
        //Inflate the fragment_main layout
        View layout = inflater.inflate(R.layout.fragment_main, container, false);

        //Initialising the text view
        textView = (TextView) layout.findViewById(R.id.position);

        //Getting a reference to the TextView (as defined in fragment_main) and set it to a value
        Bundle bundle = getArguments();

        //Safety Check
        if (bundle != null) {
            textView.setText("The page currently selected is " + bundle.getInt("position"));
        }

        return layout;
    }
}
}

,这是我的布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="10dp"
    android:paddingLeft="0dp"
    android:paddingRight="0dp"
    android:paddingTop="0dp"
    tools:context=".MainActivityFragment">

    <android.support.v7.widget.Toolbar 
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:toolbar="http://schemas.android.com/apk/res-auto"
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?actionBarSize"
        toolbar:theme="@style/ActionBarThemeOverlay"
        toolbar:titleTextAppearance="@style/ActionBar.TitleText">
    </android.support.v7.widget.Toolbar>

    <com.divyeshbc.slidingscrollbar.tabs.SlidingTabLayout
        android:id="@+id/tabs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <android.support.v4.view.ViewPager
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

</LinearLayout>

这是我的风格:

    <resources>

        <!-- Base application theme. -->
        <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <!--No Action Bar as the main theme is being replaced by custom Theme-->
        </style>
        <!-- Customize your theme here. -->

        <!--Creating a Base-->
        <style name="Theme.Base" parent="AppTheme">
            <!--Similar to Inheritance, inheriting from AppTheme and extending ie. overriding defaults for custom-->
            <!--Mapping actual android colour properties to our custom colours-->
            <item name="colorPrimary">@color/basePrimaryBackgroundColour
                </item> <!--Background colour-->
            <item name="colorPrimaryDark">
                 @color/baseSecondaryBackgroundColour</item>
            <item name="windowActionBar">false
                 </item> <!--Not using an Action Bar-->
            <item name="android:windowNoTitle">true</item> 
                         <!--Don't want to show a title-->
            <item name="android:windowBackground">
                  @color/baseBackgroundColour</item> 
                         <!--Default Background Coloer-->
        </style>

        <!--Basic Theme. Theme.Custom inherits from theme.base 
            which inherits from AppTheme -->
        <style name="Theme.Custom" parent="Theme.Base"/>

    <!-- The theme that will override the default action bar -->
    <style name="ActionBarThemeOverlay" parent="">
        <item name="android:textColorPrimary">
            @color/basePrimaryTextColour</item>
        <item name="colorControlHighlight">
            @color/baseBackgroundColour</item>
        <item name="android:actionMenuTextColor">
            @color/basePrimaryTextColour</item>
        <item name="android:textColorSecondary">
            @color/baseSecondaryTextColour</item>
        <item name="android:background">
            @color/basePrimaryBackgroundColour</item>
    </style>

    <!--Action Bar Title Text -->
    <style name="ActionBar.TitleText" 
           parent="TextAppearance.AppCompat.Widget.ActionBar.Title">
     <!--Action Bar Title Text -->
<style name="ActionBar.TitleText" parent="TextAppearance.AppCompat.Widget.ActionBar.Title">
    <item name="android:textColor">@color/basePrimaryTextColour</item>
    <item name="android:textSize">18sp</item> <!-- Standard Pixels -->
</style>

    </resources>

我无法让StackOverflow接受最后一点样式代码。如果它很重要,我会找到发布它的方法。它只是定义Titletext,颜色和字体大小的几行。

2 个答案:

答案 0 :(得分:0)

替换它:

if (mToolbar != null) {
    //Use current toolbar
    setSupportActionBar(mToolbar); //Set toolbar before create?? NullPointerException it's obvious
} else {
    mToolbar = (android.support.v7.widget.Toolbar) findViewById(R.id.toolbar);
}

使用:

mToolbar = (android.support.v7.widget.Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(mToolbar);

在你的所有课程中,无论如何,即使在创建它之前你也无法检查工具栏是否为空!

答案 1 :(得分:0)

mToolbar = (android.support.v7.widget.Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(mToolbar);