我正在尝试更改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,颜色和字体大小的几行。
答案 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);