2015-12-15 5 views
0

Я пытаюсь изменить код, написанный com.divyeshbc, который я вытащил из GitHub. Исходный код устанавливает панель инструментов в main_activity и заполняет ее значками. Я хочу перекомпоновать этот код как отдельный класс, чтобы я мог открыть панель инструментов в качестве диалога, когда я нажимаю кнопку. У меня две проблемы.Сбой панели инструментов Android

1: Тип «android.support.v7.widget.Toolbar» не распознается так же, как «Панель инструментов». Мне нужно использовать все переменные специально для findViewById(). Сбой происходит в SlidingTab.initialize(), в «findViewById (R.id.toolbar)». Поиск не работает, и программа вылетает из строя.

2: (Панель инструментов) FindViewById (R.id.toolbar) отлично работает в main_activity, но не в методе, вызванном из основного действия. Я попытался заставить setContentView() к представлению, которое, как я знаю, содержит идентификатор, но он не помогает. Когда сбой поиска завершится, программа выйдет из строя.

Я использую последнюю версию 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, цвет и размер шрифта.

+0

Нам нужен код на 95% меньше и вывод логарифма. – csmckelvey

ответ

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

Во всех классе, во всяком случае вы не можете проверить, если панель является недействительным еще до его создания!

+0

Этот код работает в main_activity, но не в SlidingTab.initialize(). Причина проверки заключается в том, что панель инструментов могла быть создана в предыдущем проходе через код. –

+0

Передайте переменную ?? как инициализировать (панель инструментов) ?? –

+0

Я пробовал это. Он просто упал на следующий идентификатор, который он ищет - пейджер. Мой класс sliderTab просто не в правильном виде, чтобы найти материал. –

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