0

2つのフラグメントのアクションバーを異なるタイトルで変更しようとしています。しかし、変数が増えていますfragmentは、次の行で初期化されていない可能性があります。さまざまなスタイルのアクションバーのタイトルを異なるフラグメントで変更するにはどうすればよいですか?

ProfileFragment fragment = (ProfileFragment) fragment.get(0);助けのためのCombineFragmentActivityonPageSelectedでmethod.Thanksで

StartingTestFragment fragment2 = (StartingTestFragment) fragment2.get(0); 

CombineFragmentActivity.java

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.view.PagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.support.v7.app.AppCompatActivity; 
import android.view.Gravity; 

import java.util.ArrayList; 
import java.util.List; 
import java.util.Vector; 

public class CombineFragmentActivity extends AppCompatActivity { 
    private PagerAdapter mPagerAdapter; 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.combine_fragment_activity); 
     initialisePaging(); 
    } 

    private void initialisePaging() { 

     List<Fragment> fragments = new ArrayList<>(); 
     fragments.add(new StartingTestFragment()); 
     fragments.add(new ProfileFragment()); 
     mPagerAdapter = new PagerAdapter1(this.getSupportFragmentManager(),fragments); 

     ViewPager pager = (ViewPager)findViewById(R.id.viewpager); 
     pager.setAdapter(mPagerAdapter); 

     pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener(){ 
      @Override 
      public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

      } 

      @Override 
      public void onPageSelected(int position) { 
       if(position == 0) { 
        ProfileFragment fragment = (ProfileFragment) fragment.get(0); 
        fragment.setActionBarTitle("Profil"); 
       } else { 
        StartingTestFragment fragment2 = (StartingTestFragment) fragment2.get(0); 
        fragment2.setActionBarTitle("Anasayfa"); 
       } 

      } 

      @Override 
      public void onPageScrollStateChanged(int state) { 

      } 

     }); 
    } 
} 

ProfileFragment.java

import android.graphics.Color; 
import android.graphics.Typeface; 
import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.support.v4.app.Fragment; 
import android.support.v7.app.ActionBar; 
import android.support.v7.app.AppCompatActivity; 
import android.util.TypedValue; 
import android.view.Gravity; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.RelativeLayout; 
import android.widget.TextView; 
import android.widget.Toast; 


public class ProfileFragment extends Fragment implements AdapterView.OnItemSelectedListener { 
    public ProfileFragment() { 
     // Required empty public constructor 
    } 


    public static ProfileFragment newInstance() { 
     ProfileFragment fragment = new ProfileFragment(); 
     return fragment; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setHasOptionsMenu(true); 
    } 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.fragment_profile, container, false); 

    } 

    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 

     Typeface ubuntu_MI = Typeface.createFromAsset(getActivity().getAssets(),"Ubuntu-MI.ttf"); 
     Typeface ubuntu_L = Typeface.createFromAsset(getActivity().getAssets(),"Ubuntu-L.ttf"); 
     Typeface ubuntu_R = Typeface.createFromAsset(getActivity().getAssets(),"Ubuntu-R.ttf"); 


     /** 
     * Be carefull when trying to find a view element from a layout if the name is already defined in any layout 
     * AndroidStudio will not hint an error and you will end up with with ugly null pointer error 
     TextView question = (TextView) view.findViewById(R.id.textView7); 
     question.setTypeface(ubuntu_R); 
     TextView info = (TextView) view.findViewById(R.id.textView6); 
     info.setTypeface(ubuntu_R); 

     */ 


    } 
    public void setActionBarTitle(String title) { 
     Typeface ubuntu_MI = Typeface.createFromAsset(getActivity().getAssets(),"Ubuntu-MI.ttf"); 
     // Get the ActionBar 
     android.support.v7.app.ActionBar ab = ((AppCompatActivity)getActivity()).getSupportActionBar(); 


     // Create a TextView programmatically. 
     TextView tv = new TextView(getActivity()); 

     // Create a LayoutParams for TextView 
     RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
       RelativeLayout.LayoutParams.MATCH_PARENT, // Width of TextView 
       RelativeLayout.LayoutParams.WRAP_CONTENT); // Height of TextView 

     // Apply the layout parameters to TextView widget 
     tv.setLayoutParams(lp); 

     // Set text to display in TextView 
     // This will set the ActionBar title text 
     tv.setText(title); 

     // Set the text color of TextView 
     // This will change the ActionBar title text color 
     tv.setTextColor(Color.parseColor("#FFF5EE")); 

     // Center align the ActionBar title 
     tv.setGravity(Gravity.CENTER_HORIZONTAL); 

     // Set the serif font for TextView text 
     // This will change ActionBar title text font 
     tv.setTypeface(ubuntu_MI); 

     // Underline the ActionBar title text 
     // tv.setPaintFlags(tv.getPaintFlags()| Paint.UNDERLINE_TEXT_FLAG); 

     // Set the ActionBar title font size 
     tv.setTextSize(TypedValue.COMPLEX_UNIT_DIP,24); 

     // Display a shadow around ActionBar title text 
     //tv.setShadowLayer(
     //  1.f, // radius 
     // 2.0f, // dx 
     // 2.0f, // dy 
     // Color.parseColor("#FF8C00") // shadow color 
     //); 

     // Set the ActionBar display option 
     ab.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); 

     // Finally, set the newly created TextView as ActionBar custom view 
     ab.setCustomView(tv); 
    } 
    public boolean onOptionsItemSelected(MenuItem item) { 
    //Action Bar' daki settings kısmına basıldığında ne yapacağını söylüyoruz. 
     if(item.getItemId() == R.id.settings){ 
      Toast.makeText(getActivity(), "Ayarlara basıldı", Toast.LENGTH_SHORT).show(); 
     } 

     return super.onOptionsItemSelected(item); 
    } 

    @Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     super.onCreateOptionsMenu(menu, inflater); 
     inflater.inflate(R.menu.menu_profile_activity, menu); 

    } 
    @Override 
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 

    } 

    @Override 
    public void onNothingSelected(AdapterView<?> parent) { 

    } 

} 

StartingTestFragment.java

import android.graphics.Color; 
import android.graphics.Typeface; 
import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.support.v4.app.Fragment; 
import android.support.v7.app.ActionBar; 
import android.support.v7.app.AppCompatActivity; 
import android.util.TypedValue; 
import android.view.Gravity; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.RelativeLayout; 
import android.widget.Spinner; 
import android.widget.TextView; 


public class StartingTestFragment extends Fragment implements AdapterView.OnItemSelectedListener { 
    private Spinner spinner; 
    ArrayAdapter<CharSequence> adapter; 



    public StartingTestFragment() { 
     // Required empty public constructor 
    } 


    public static StartingTestFragment newInstance() { 
     StartingTestFragment fragment = new StartingTestFragment(); 
     return fragment; 
    } 

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

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     return inflater.inflate(R.layout.fragment_startingtest, container, false); 
    } 

    @Override 
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 
     spinner = (Spinner)view.findViewById(R.id.spinner); 
     adapter = ArrayAdapter.createFromResource(getActivity(),R.array.simple_spinner_dropdown_item,R.layout.spinner_item); 
     adapter.setDropDownViewResource(R.layout.spinner_dropdown_item); 

     spinner.setAdapter(adapter); 
     spinner.setOnItemSelectedListener(this); 


     Typeface ubuntu_L = Typeface.createFromAsset(getActivity().getAssets(),"Ubuntu-L.ttf"); 
     Typeface ubuntu_R = Typeface.createFromAsset(getActivity().getAssets(),"Ubuntu-R.ttf"); 

     TextView info = (TextView) view.findViewById(R.id.textView6); 
     TextView question = (TextView) view.findViewById(R.id.textView7); 

     info.setTypeface(ubuntu_R); 
     question.setTypeface(ubuntu_R); 



    } 
    public void setActionBarTitle(String title) { 
     Typeface ubuntu_MI = Typeface.createFromAsset(getActivity().getAssets(),"Ubuntu-MI.ttf"); 
     // Get the ActionBar 
     android.support.v7.app.ActionBar ab = ((AppCompatActivity)getActivity()).getSupportActionBar(); 


     // Create a TextView programmatically. 
     TextView tv = new TextView(getActivity()); 

     // Create a LayoutParams for TextView 
     RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
       RelativeLayout.LayoutParams.MATCH_PARENT, // Width of TextView 
       RelativeLayout.LayoutParams.WRAP_CONTENT); // Height of TextView 

     // Apply the layout parameters to TextView widget 
     tv.setLayoutParams(lp); 

     // Set text to display in TextView 
     // This will set the ActionBar title text 
     tv.setText(title); 

     // Set the text color of TextView 
     // This will change the ActionBar title text color 
     tv.setTextColor(Color.parseColor("#FFF5EE")); 

     // Center align the ActionBar title 
     tv.setGravity(Gravity.CENTER_HORIZONTAL); 

     // Set the serif font for TextView text 
     // This will change ActionBar title text font 
     tv.setTypeface(ubuntu_MI); 

     // Underline the ActionBar title text 
     // tv.setPaintFlags(tv.getPaintFlags()| Paint.UNDERLINE_TEXT_FLAG); 

     // Set the ActionBar title font size 
     tv.setTextSize(TypedValue.COMPLEX_UNIT_DIP,24); 

     // Display a shadow around ActionBar title text 
     //tv.setShadowLayer(
     //  1.f, // radius 
     // 2.0f, // dx 
     // 2.0f, // dy 
     // Color.parseColor("#FF8C00") // shadow color 
     //); 

     // Set the ActionBar display option 
     ab.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); 

     // Finally, set the newly created TextView as ActionBar custom view 
     ab.setCustomView(tv); 
    } 

    @Override 
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
     switch (position) { 
      case 0: 
       // Whatever you want to happen when the first item gets selected 
       break; 
      case 1: 
       // Whatever you want to happen when the second item gets selected 
       break; 
      case 2: 
       // Whatever you want to happen when the thrid item gets selected 
       break; 

     } 
    } 

    @Override 
    public void onNothingSelected(AdapterView<?> parent) { 

    } 
} 

ERROR: FATAL EXCEPTION: main java.lang.ClassCastException: com.example.khas.memorizingwords.ProfileFragment cannot be cast to com.example.khas.memorizingwords.StartingTestFragment at com.example.khas.memorizingwords.CombineFragmentActivity$1.onPageSelected(CombineFragmentActivity.java:46) at android.support.v4.view.ViewPager.dispatchOnPageSelected(ViewPager.java:1862) at android.support.v4.view.ViewPager.scrollToItem(ViewPager.java:625) at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:609) at android.support.v4.view.ViewPager.onTouchEvent(ViewPager.java:2176) at android.view.View.dispatchTouchEvent(View.java:7127) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2170) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1905) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1919) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1919) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1919) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1919) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1919) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1919) at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1925) at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1379) at android.app.Activity.dispatchTouchEvent(Activity.java:2396) at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:60) at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1873) at android.view.View.dispatchPointerEvent(View.java:7307) at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3172) at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3117) at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4153) at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4132) at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4224) at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:171) at android.os.MessageQueue.nativePollOnce(Native Method) at android.os.MessageQueue.next(MessageQueue.java:125) at android.os.Looper.loop(Looper.java:124) at android.app.ActivityThread.main(ActivityThread.java:4745) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) at dalvik.system.NativeStart.main(Native Method)

+0

を行うことによって、最終的なリスト作り... https://github.com/tekinarslan/AndroidMaterialDesignToolbar –

+0

おかげでなく、プロジェクトの構造は異なる。問題を解決する方法を知っていますか? –

+0

のうちどれですか? –

答えて

1

あなたのフラグメント変数は初期化されておらず、あなたはそれを取得しています。これは正しい方法ではありません。これは、これはタイトル

setActionBarTitle(YOUR_TITLE); 

使用この代わりのfragment.setACtionBarTitle

を変更する方法で、より良いバージョンと、より一般的な

@Override 
     public void onPageSelected(int position) { 
      Fragment fragment1 = getActivity().getSupportFragmentManager().getFragments().get(position); 
       if(fragment1 instanceof ProfileFragment) { 
        ProfileFragment fragment = (ProfileFragment) fragment1; 
        fragment.setActionBarTitle("Profil"); 
       } 
       else{ 
        StartingTestFragment fragment = (StartingTestFragment) fragment1; 
        fragment.setActionBarTitle("Anasayfa"); 
       } 
      } 

     } 

あるコード

@Override 
       public void onPageSelected(int position) { 
        if(position == 0) { 
         ProfileFragment fragment = (ProfileFragment) getSupportFragmentManager().getFragments().get(1) 
         fragment.setActionBarTitle("Profil"); 
        } else { 
         StartingTestFragment fragment2 = (StartingTestFragment) getSupportFragmentManager().getFragments().get(0); 
         fragment2.setActionBarTitle("Anasayfa"); 
        } 

       } 

の下に試してみてください私はマネージャーから捜索されたときに断片の順序が何であるか保証されていないと思う。だから、単純にこの

@Override 
      public void onPageSelected(int position) { 
       Fragment fragment1 = fragments.get(position); 
       if(fragment1 instanceof ProfileFragment) { 
        ProfileFragment fragment = (ProfileFragment) fragment1; 
        fragment.setActionBarTitle("Profil"); 
       } 
       else{ 
        StartingTestFragment fragment = (StartingTestFragment) fragment1; 
        fragment.setActionBarTitle("Anasayfa"); 
       } 

      } 

注操作を行います。あなたのフラグメントはこのgithubの例を試してみてください。この

final List<Fragment> fragments = new ArrayList<>(); 
+0

これを試すと、プログラムは停止します。致命的なエラーで質問を更新しました。 –

+0

@ D.Y編集を参照して、私はget(0)とget(1)を入れ替えました。これは確実に機能します! – varunkr

+0

コードをコピーして貼り付けました。うまくいきませんでした。 –

関連する問題