2017-04-13 36 views
-1

我的自定义工具栏在toolbar_main.xml如下应用程序试图通过延长

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.Toolbar 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/toolbar" 
    android:minHeight="?attr/actionBarSize" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="?attr/colorPrimary" 
    android:contentInsetLeft="0dp" 
    app:contentInsetStart="0dp" 
    > 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    > 
    <TextView 
     android:id="@+id/app_name" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:textColor="@color/white" 
     android:textSize="40dp" 
     /> 
</LinearLayout> 
</android.support.v7.widget.Toolbar> 

并从activity_main.xml

<include 
     layout="@layout/toolbar_main" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"/> 

称为在我MainActivity.OnCreate()我设定的描述自定义活动重复使用工具栏时崩溃工具栏作为操作栏并执行一些操作

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
setSupportActionBar(toolbar); 
getSupportActionBar().setDisplayShowHomeEnabled(true); 
getSupportActionBar().setLogo(R.drawable.ic_logo_linkshare); 
getSupportActionBar().setDisplayUseLogoEnabled(true); 
getSupportActionBar().setDisplayShowTitleEnabled(false); 

Typeface ralewaySemiBold = Typeface.createFromAsset(getAssets(), "Raleway-SemiBold.ttf"); 
Typeface ralewayItalic = Typeface.createFromAsset(getAssets(), "Raleway-Italic.ttf"); 
String text1 = "link"; 
String text2 = "share"; 
Spannable s = new SpannableString(text1+text2); 
s.setSpan(new CustomTypefaceSpan(ralewaySemiBold), 0, text1.length(), Spannable.SPAN_EXCLUSIVE_INCLUSIVE); 
s.setSpan(new CustomTypefaceSpan(ralewayItalic), text1.length(), text1.length()+text2.length(), Spannable.SPAN_EXCLUSIVE_INCLUSIVE); 
TextView lettering = (TextView) findViewById(R.id.app_name); 
lettering.setText(s); 

当我有MainActivity我下面

@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.menu_main, menu); 
     return true; } 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      [...] 


     } 
} 

一个自定义菜单(这是不同于我想在其他活动中使用的菜单)因为我想显示该工具栏(带有徽标和自定义标题)在我所有的活动(但分开处理菜单)我想创建一个自定义的活动,并随后扩大它,无论我需要它。

public class MenuActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_menu); 

     getSupportActionBar().setDisplayShowHomeEnabled(true); 
     getSupportActionBar().setLogo(R.drawable.ic_logo_linkshare); 
     getSupportActionBar().setDisplayUseLogoEnabled(true); 
     getSupportActionBar().setDisplayShowTitleEnabled(false); 

     Typeface ralewaySemiBold = Typeface.createFromAsset(getAssets(), "Raleway-SemiBold.ttf"); 
     Typeface ralewayItalic = Typeface.createFromAsset(getAssets(), "Raleway-Italic.ttf"); 

     String text1 = "link"; 
     String text2 = "share"; 

     Spannable s = new SpannableString(text1+text2); 
     s.setSpan(new CustomTypefaceSpan(ralewaySemiBold), 0, text1.length(), Spannable.SPAN_EXCLUSIVE_INCLUSIVE); 
     s.setSpan(new CustomTypefaceSpan(ralewayItalic), text1.length(), text1.length()+text2.length(), Spannable.SPAN_EXCLUSIVE_INCLUSIVE); 

     TextView lettering = (TextView) findViewById(R.id.app_name); 
     lettering.setText(s); 
    } 
} 

基本上从MainActivity移动设置代码,而是当我启动的应用程序扩展它

public class MainActivity extends MenuActivity

在发生碰撞这多少结果,没有任何错误或警告在logcat的

我做的东西是不应该的?

--Edit1--

我发现,如果我添加

<include 
layout="@layout/toolbar_main" 
android:layout_width="match_parent" 
android:layout_height="wrap_content"/> 

activity_menu-xml即:中MenuActivity的XML,应用程序不会崩溃,但空的工具栏显示

--Edit2--

> FATAL EXCEPTION: main 
Process: com.dima.polimi.massimobortolamei.linkshare, PID: 17736 
Theme: themes:{} 
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.dima.polimi.massimobortolamei.linkshare/com.dima.polimi.massimobortolamei.linkshare.activities.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.app.ActionBar.setDisplayShowHomeEnabled(boolean)' on a null object reference 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2450) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2510) 
    at android.app.ActivityThread.-wrap11(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1363) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:5461) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
    Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.app.ActionBar.setDisplayShowHomeEnabled(boolean)' on a null object reference 
    at com.dima.polimi.massimobortolamei.linkshare.activities.MenuActivity.onCreate(MenuActivity.java:23) 
    at com.dima.polimi.massimobortolamei.linkshare.activities.MainActivity.onCreate(MainActivity.java:94) 
    at android.app.Activity.performCreate(Activity.java:6251) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2403) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2510)  
    at android.app.ActivityThread.-wrap11(ActivityThread.java)  
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1363)  
    at android.os.Handler.dispatchMessage(Handler.java:102)  
    at android.os.Looper.loop(Looper.java:148)  
    at android.app.ActivityThread.main(ActivityThread.java:5461)  
    at java.lang.reflect.Method.invoke(Native Method)  
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  
+0

您可以发布从崩溃的logcat的? –

+0

不幸的是,Logcat中没有错误!它只是崩溃!请参阅编辑 – MaX

+0

如果应用程序崩溃,应该有一个logcat。检查您的过滤器 –

回答

0

你可能想给的要olbar包含一个ID。

<include 
    android:id="@+id/toolbar" 
    layout="@layout/toolbar_main" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"/> 

而且你似乎缺少在MenuActivity工具栏设置,这也解释了NullPointerException

setContentView(R.layout.activity_menu); 

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
setSupportActionBar(toolbar); 

// Find the view from the toolbar 
TextView lettering = (TextView) toolbar.findViewById(R.id.app_name); 

注:一个好的想法是做一个protected void setupToolbar()方法,那么你可以隐藏掉从MainActivity通过继承。

public abstract class ToolbarActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(getLayoutRes()); 
     setupToolbar(); 
    } 

    protected abstract int getLayoutRes(); 

    protected void setupToolbar() { 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     // Find the view from the toolbar 
     TextView lettering = (TextView) toolbar.findViewById(R.id.app_name); 
     getSupportActionBar().setDisplayShowHomeEnabled(true); 
     getSupportActionBar().setLogo(R.drawable.ic_logo_linkshare); 
     getSupportActionBar().setDisplayUseLogoEnabled(true); 
     getSupportActionBar().setDisplayShowTitleEnabled(false); 

     Typeface ralewaySemiBold = Typeface.createFromAsset(getAssets(), "Raleway-SemiBold.ttf"); 
     Typeface ralewayItalic = Typeface.createFromAsset(getAssets(), "Raleway-Italic.ttf"); 

     String text1 = "link"; 
     String text2 = "share"; 

     Spannable s = new SpannableString(text1+text2); 
     s.setSpan(new CustomTypefaceSpan(ralewaySemiBold), 0, text1.length(), Spannable.SPAN_EXCLUSIVE_INCLUSIVE); 
     s.setSpan(new CustomTypefaceSpan(ralewayItalic), text1.length(), text1.length()+text2.length(), Spannable.SPAN_EXCLUSIVE_INCLUSIVE); 

     lettering.setText(s); 
    } 
} 

public class MainActivity extends ToolbarActivity { 

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

    @Override 
    protected int getLayoutRes() { 
     return R.layout.activity_main; 
    } 
+0

我已经有它在'toolbar_main宣布工具栏的ID。xml',我应该给一个包含ID吗?我在'MenuActivity'中添加了工具栏设置,但是同样的错误。我应该在“activity_menu”中加入工具栏吗? – MaX

+0

复制ID不会造成伤害。一般规则:无论“setContentView”使用什么,都需要工具栏 –

+0

好吧,我已经复制了ID并将工具栏包含在'MenuActivity'的布局中。该应用程序不再崩溃,但现在工具栏是空的 – MaX