2015-10-15 53 views
0

我是Android開發新手。我已經爲我的活動做了一個Tab導航,但是現在我將代碼轉移到我的項目的Fragment中,我遇到了一些錯誤。有人可以幫助我正確的方式在片段內做到這一點。添加選項卡導航到我的片段

注:我以前import android.support.v4.app.Fragment;兩個frmSlide和fragmentFeedFragment

我frmSlide代碼是這樣的

public class frmSlide extends AppCompatActivity 
    implements NavigationDrawerFragment.NavigationDrawerCallbacks { 

/** 
* Fragment managing the behaviors, interactions and presentation of the navigation drawer. 
*/ 
private NavigationDrawerFragment mNavigationDrawerFragment; 

/** 
* Used to store the last screen title. For use in {@link #restoreActionBar()}. 
*/ 
private CharSequence mTitle; 
ViewPager viewPager; 

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

    mNavigationDrawerFragment = (NavigationDrawerFragment) 
      getSupportFragmentManager().findFragmentById(R.id.navigation_drawer); 
    mTitle = getTitle(); 

    // Set up the drawer. 
    mNavigationDrawerFragment.setUp(
      R.id.navigation_drawer, 
      (DrawerLayout) findViewById(R.id.drawer_layout)); 
} 

@Override 
public void onNavigationDrawerItemSelected(int position) { 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    // update the main content by replacing fragments 
    fragmentManager.beginTransaction().replace(R.id.container, PlaceholderFragment.newInstance(position + 1)).commit(); 

    Fragment fragment; 
    switch (position + 1) { 
     case 1: 
      //Profile 
      fragment = new fragmentProfileFragment(); 
      fragmentManager.beginTransaction().replace(R.id.container, fragment).commit(); 
      break; 
     case 2: 
      //startActivity(new Intent(this, fragmentFeed.class)); 
      //Feed 
      fragment = new fragmentFeedFragment(); 
      fragmentManager.beginTransaction().replace(R.id.container, fragment).commit(); 
      break; 
     case 3: 
      //Settings 
      fragment = new fragmentSettingsFragment(); 
      fragmentManager.beginTransaction().replace(R.id.container, fragment).commit(); 
      break; 
     case 4: 
      //About 
      fragment = new fragmentAboutFragment(); 
      fragmentManager.beginTransaction().replace(R.id.container, fragment).commit(); 
      break; 
    } 
    Log.d("MySlide", "onNavigation " + position); 

} 

//SELECTED/CLICKED MENU ON SLIDE MENU 
public void onSectionAttached(int number) { 
    switch (number) { 
     case 1: 
      mTitle = getString(R.string.title_section1); 
      //Toast.makeText(frmSlide.this, "Profile was selected", Toast.LENGTH_SHORT).show(); 
      break; 
     case 2: 
      mTitle = getString(R.string.title_section2); 
      //Toast.makeText(frmSlide.this, "Feed was selected", Toast.LENGTH_SHORT).show(); 
      break; 
     case 3: 
      mTitle = getString(R.string.title_section3); 
      //Toast.makeText(frmSlide.this, "Settings was selected", Toast.LENGTH_SHORT).show(); 
      break; 
     case 4: 
      mTitle = getString(R.string.title_section4); 
      //Toast.makeText(frmSlide.this, "About was selected", Toast.LENGTH_SHORT).show(); 
      break; 
     case 5: 
      AlertDialog.Builder builder = new AlertDialog.Builder(this); 
      builder.setMessage("Are you sure you want to Logout?") 
        .setCancelable(false) 
        .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int id) { 
          finish(); 
          startActivity(new Intent(frmSlide.this, MainActivity.class));//Close this Activity for example: MyActivity.java 
         } 
        }) 
        .setNegativeButton("No", new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int id) { 
          // some code if you want 
          dialog.cancel(); 
          restoreActionBar(); 
         } 
        }); 
      AlertDialog alert = builder.create(); 
      alert.show(); 
      break; 

     } 
} 


public void restoreActionBar() { 
    ActionBar actionBar = getSupportActionBar(); 
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); 
    actionBar.setDisplayShowTitleEnabled(true); 
    actionBar.setTitle(mTitle); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    if (!mNavigationDrawerFragment.isDrawerOpen()) { 
     // Only show items in the action bar relevant to this screen 
     // if the drawer is not showing. Otherwise, let the drawer 
     // decide what to show in the action bar. 
     getMenuInflater().inflate(R.menu.frm_slide, menu); 
     restoreActionBar(); 
     return true; 
    } 
    return super.onCreateOptionsMenu(menu); 
} 

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

/** 
* A placeholder fragment containing a simple view. 
*/ 
public static class PlaceholderFragment extends Fragment { 
    /** 
    * The fragment argument representing the section number for this 
    * fragment. 
    */ 
    private static final String ARG_SECTION_NUMBER = "section_number"; 

    /** 
    * Returns a new instance of this fragment for the given section 
    * number. 
    */ 
    public static PlaceholderFragment newInstance(int sectionNumber) { 
     PlaceholderFragment fragment = new PlaceholderFragment(); 
     Bundle args = new Bundle(); 
     args.putInt(ARG_SECTION_NUMBER, sectionNumber); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    public PlaceholderFragment() { 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_frm_slide, container, false); 
     return rootView; 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     ((frmSlide) activity).onSectionAttached(
       getArguments().getInt(ARG_SECTION_NUMBER)); 
    } 
} 

}

這是我在fragmentFeedFragment。

public class fragmentFeedFragment extends Fragment implements ActionBar.TabListener { 
ViewPager viewPager; 
ActionBar actionBar; 

public fragmentFeedFragment() { 
} 

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


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

    viewPager = (ViewPager) getView().findViewById(R.id.pager); 
    viewPager.setAdapter(new MyFeedAdapter(getFragmentManager())); 
    viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
     @Override 
     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 
      Log.d("Vivz", "onTabSelected at " + "position " + position + "from " + positionOffset + "pixels # " + positionOffsetPixels); 
     } 

     @Override 
     public void onPageSelected(int position) { 
      actionBar.setSelectedNavigationItem(position); 
      //Log.d("Vivz", "onTabSelected at " + "position " + position); 
     } 

     @Override 
     public void onPageScrollStateChanged(int state) { 

     } 
    }); 
    actionBar = ((ActionBarActivity)getActivity()).getSupportActionBar(); 
    //actionBar = getSupportActionBar(); 
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

    ActionBar.Tab tab1 = actionBar.newTab(); 
    tab1.setText("JOY"); 
    tab1.setTabListener(this); 

    ActionBar.Tab tab2 = actionBar.newTab(); 
    tab2.setText("SADNESS"); 
    tab2.setTabListener(this); 

    ActionBar.Tab tab3 = actionBar.newTab(); 
    tab3.setText("ANGER"); 
    tab3.setTabListener(this); 

    actionBar.addTab(tab1); 
    actionBar.addTab(tab2); 
    actionBar.addTab(tab3); 
} 

@Override 
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) { 
    viewPager.setCurrentItem(tab.getPosition()); 
} 

@Override 
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) { 

} 

@Override 
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) { 

} 

}

類MyFeedAdapter擴展FragmentPagerAdapter {

public MyFeedAdapter(FragmentManager fm) { 
    super(fm); 
} 

@Override 
public Fragment getItem(int position) { 
    Fragment fragment = null; 
    if (position==0){ 
     fragment = new fragmentJoyFragment(); 
    } 
    if (position==1){ 
     fragment = new fragmentSadnessFragment(); 
    } 
    if (position==2){ 
     fragment = new fragmentAngerFragment(); 
    } 
    return fragment; 
} 

@Override 
public int getCount() { 
    return 3; 
} 

}

這裏是出現了

10-15 11:11:37.781 16034-16034/com.example.agnes.myapplication E/AndroidRuntime﹕ FATAL EXCEPTION: main 
java.lang.ClassCastException: com.example.agnes.myapplication.frmSlide cannot be cast to android.support.v7.app.ActionBarActivity 
     at com.example.agnes.myapplication.fragmentFeedFragment.onActivityCreated(fragmentFeedFragment.java:54) 
     at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1970) 
     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1051) 
     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1207) 
     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738) 
     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1572) 
     at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:493) 
     at android.os.Handler.handleCallback(Handler.java:615) 
     at android.os.Handler.dispatchMessage(Handler.java:92) 
     at android.os.Looper.loop(Looper.java:213) 
     at android.app.ActivityThread.main(ActivityThread.java:4787) 
     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:789) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556) 
     at dalvik.system.NativeStart.main(Native Method) 
+0

在你的'fragmentFeedFragment.java'中檢查第37行。你有NPE –

+0

謝謝7月,我已經修復了第37行: 現在其他錯誤出現在第54行:actionBar =((ActionBarActivity)getActivity())。getSupportActionBar(); – Than

+0

什麼是錯誤 –

回答

1

在fragmentFeedFragment錯誤。 java的:54,
變化

actionBar = ((ActionBarActivity)getActivity()).getSupportActionBar();

actionBar = getActionBar(); 
0

我從我的frmSlide改變AppCompatActivityActionBarActivity固定的這個問題。