gpt4 book ai didi

android - Android工具栏崩溃

转载 作者:行者123 更新时间:2023-12-03 17:18:31 25 4
gpt4 key购买 nike

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

1:类型“android.support.v7.widget.Toolbar”未被识别为与“Toolbar”相同。我必须强制转换所有变量,以便findViewById()正常工作。崩溃发生在“findViewById(R.id.toolbar)”中的SlidingTab.initialize()中。查找失败,程序崩溃。

2 :(工具栏)FindViewById(R.id.toolbar)在main_activity中工作正常,但在从main Activity 中调用的方法中效果不佳。我试图将setContentView()强制为一个我知道持有该ID的 View ,但它没有帮助。当查找失败时,程序崩溃。

我正在使用最新的Android IDE(我认为是1.5)和最新的SDK。我被困住了-我将不胜感激任何建议。

这是我的MainActivity

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,颜色和字体大小。

最佳答案

替换为:

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

在所有 class 中,无论如何,即使在创建工具栏之前,也无法检查其是否为空!

关于android - Android工具栏崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34296755/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com