8

私は2つの断片で活動しています。私はPageAdapterを使って2つのビューをスワイプすることに決めましたが、アンドロイドデザインのベストプラクティスに近づくために、私はアクションバーのタブ(固定のもの)を使うことに決めました。私はActionBarSherlockとhereのコードを使ってタブを実装しています。 1ページ目のフラグメント(MatchRugbyButtonFragment)は自分自身のイメージを強調します。私がそれに触れ、何かを移動したり変更したりすると、上のイメージが表示されます。作業断片。 2)2番目のフラグメントに行くと、最初の変数はすべての変数を失います(タイマーリセット、カウンタリセット、ecc)。 片方がSherlockFragmentであり、もう片方がSherlockListFragmentで、その断片をSherlockListFragmentにキャストできないエラーが発生したため、tablistenerに作成する必要がありました。ここ は活動である:ここではTabListener、ActionBarSherlockのフラグメントとListFragment、PageAdapterの混合?混乱

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

    import android.content.Intent; 
    import android.os.Bundle; 
    import android.support.v4.app.Fragment; 
    import android.support.v4.app.FragmentManager; 
    import android.support.v4.app.FragmentTransaction; 
    import android.support.v4.app.ListFragment; 
    import android.support.v4.view.ViewPager; 
    import android.view.View; 
    import android.widget.ArrayAdapter; 
    import android.widget.Toast; 

     import com.actionbarsherlock.app.ActionBar; 
    import com.actionbarsherlock.app.ActionBar.Tab; 
    import com.actionbarsherlock.app.SherlockFragment; 
    import com.actionbarsherlock.app.SherlockFragmentActivity; 
    import com.actionbarsherlock.view.Menu; 
    import com.actionbarsherlock.view.MenuInflater; 
    import com.actionbarsherlock.view.MenuItem; 


    public class MatchRugbyFragments extends SherlockFragmentActivity implements View.OnClickListener, View.OnLongClickListener{ 


public static ArrayList<String> commentary; 

public static ArrayAdapter<String> adapter; 



// list contains fragments to instantiate in the viewpager 
static List<Fragment> fragments = new Vector<Fragment>(); 
// page adapter between fragment list and view pager 
private MyPagerAdapter mPagerAdapter; 
// view pager 
private ViewPager mPager; 




protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);  
    setContentView(R.layout.fragments_rugby); 

    FragmentManager fragmentManager = getSupportFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 

    MatchRugbyButtonFragment buttonFrag = new MatchRugbyButtonFragment(); 
    MatchRugbySummaryFragment listFrag = new MatchRugbySummaryFragment(); 
    fragmentTransaction.add(R.id.pager, buttonFrag); 
    fragmentTransaction.add(R.id.pager, listFrag); 
    fragmentTransaction.commit(); 


    // creating fragments and adding to list 
    fragments.add(buttonFrag); 
    fragments.add(listFrag); 


    // creating adapter and linking to view pager 
    this.mPagerAdapter = new MyPagerAdapter(super.getSupportFragmentManager(),fragments); 
    mPager = (ViewPager) super.findViewById(R.id.pager); 
    mPager.setAdapter(this.mPagerAdapter); 


    String[] array = {""}; 
    commentary = new ArrayList<String>(); 
    commentary.addAll(Arrays.asList(array)); 

    adapter = new ArrayAdapter<String>(this, 
      R.layout.list_item_commentary, commentary); 





    final ActionBar bar = getSupportActionBar(); 
    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
    bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE); 
    bar.setHomeButtonEnabled(true); 

    bar.addTab(bar.newTab() 
      .setText("Comandi") 
      .setTabListener(new TabListener<MatchRugbyButtonFragment>(
        this, "comandi", MatchRugbyButtonFragment.class))); 
    bar.addTab(bar.newTab() 
      .setText("Riassunto") 
      .setTabListener(new TabListenerList<MatchRugbySummaryFragment>(
        this, "riassunto", MatchRugbySummaryFragment.class))); 


    if (savedInstanceState != null) { 
     bar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0)); 
    } 
} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putInt("tab", getActionBar().getSelectedNavigationIndex()); 
} 

//Comandi per il click prolungato 
public boolean onLongClick(View view) { 

    return false; 
} 


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

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    case android.R.id.home: 
     // app icon in action bar clicked; go home 
     Intent intent = new Intent(this, SportScoutActivity.class); 
     intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     startActivity(intent); 
     return true; 
    default: 
     return super.onOptionsItemSelected(item); 
    } 
} 
public static void addCommentaryRow(String s){ 
    adapter.add(s); 
    MatchRugbySummaryFragment f2 = (MatchRugbySummaryFragment) fragments.get(1); 
    f2.setListAdapter(adapter); 
} 

public static String commentaryToString(){ 
    String sAdapter= adapter.toString(); 
    return sAdapter; 
} 

public void onClick(View arg0) { 


} 



/** 
* @return the commentary 
*/ 
public ArrayList<String> getCommentary() { 
    return commentary; 
} 



/** 
* @param commentary the commentary to set 
*/ 
public void setCommentary(ArrayList<String> commentary) { 
    MatchRugbyFragments.commentary = commentary; 
} 



/** 
* @return the adapter 
*/ 
public ArrayAdapter<String> getAdapter() { 
    return adapter; 
} 



/** 
* @param adapter the adapter to set 
*/ 
public void setAdapter(ArrayAdapter<String> adapter) { 
    MatchRugbyFragments.adapter = adapter; 
} 

// page 1 fragment listener implementation 
public void onPage1(String s) {  



    // page 2 fragment update 


} 

public static class TabListener<T> implements ActionBar.TabListener { 
    private final SherlockFragmentActivity mActivity; 
    private final String mTag; 
    private final Class<T> mClass; 
    private final Bundle mArgs; 
    private android.support.v4.app.Fragment mFragment; 

    public TabListener(SherlockFragmentActivity activity, String tag, Class<T> clz) { 
     this(activity, tag, clz, null); 
    } 

    public TabListener(SherlockFragmentActivity activity, String tag, Class<T> clz, Bundle args) { 
     mActivity = activity; 
     mTag = tag; 
     mClass = clz; 
     mArgs = args; 

     // Check to see if we already have a fragment for this tab, probably 
     // from a previously saved state. If so, deactivate it, because our 
     // initial state is that a tab isn't shown. 
     mFragment = mActivity.getSupportFragmentManager().findFragmentByTag(mTag); 
     if (mFragment != null && !mFragment.isDetached()) { 
      FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction(); 
      ft.detach(mFragment); 
      ft.commit(); 
     } 
    } 

    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
     if (mFragment == null) { 
      mFragment = (SherlockFragment) Fragment.instantiate(mActivity, mClass.getName(), mArgs); 
      ft.add(android.R.id.content, mFragment, mTag); 
     } else { 
      ft.attach(mFragment); 
     } 
    } 

    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
     if (mFragment != null) { 
      ft.detach(mFragment); 
     } 
    } 

    public void onTabReselected(Tab tab, FragmentTransaction ft) { 
     Toast.makeText(mActivity, "Reselected!", Toast.LENGTH_SHORT).show(); 
    } 


} 

public static class TabListenerList<T> implements ActionBar.TabListener { 
    private final SherlockFragmentActivity mActivity; 
    private final String mTag; 
    private final Class<T> mClass; 
    private final Bundle mArgs; 
    private android.support.v4.app.ListFragment mFragment; 

    public TabListenerList(SherlockFragmentActivity activity, String tag, Class<T> clz) { 
     this(activity, tag, clz, null); 
    } 

    public TabListenerList(SherlockFragmentActivity activity, String tag, Class<T> clz, Bundle args) { 
     mActivity = activity; 
     mTag = tag; 
     mClass = clz; 
     mArgs = args; 

     // Check to see if we already have a fragment for this tab, probably 
     // from a previously saved state. If so, deactivate it, because our 
     // initial state is that a tab isn't shown. 
     mFragment = (ListFragment) mActivity.getSupportFragmentManager().findFragmentByTag(mTag); 
     if (mFragment != null && !mFragment.isDetached()) { 
      FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction(); 
      ft.detach(mFragment); 
      ft.commit(); 
     } 
    } 

    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
     if (mFragment == null) { 
      mFragment = (ListFragment) Fragment.instantiate(mActivity, mClass.getName(), mArgs); 
      ft.add(android.R.id.content, mFragment, mTag); 
     } else { 
      ft.attach(mFragment); 
     } 
    } 

    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
     if (mFragment != null) { 
      ft.detach(mFragment); 
     } 
    } 

    public void onTabReselected(Tab tab, FragmentTransaction ft) { 
     Toast.makeText(mActivity, "Reselected!", Toast.LENGTH_SHORT).show(); 
    } 


} 
    } 

はpageadapterクラスです:

package com.gmail.david.corsalini.sportscout; 

    import java.util.List; 

    import android.support.v4.app.Fragment; 
    import android.support.v4.app.FragmentManager; 
    import android.support.v4.app.FragmentPagerAdapter; 

    public class MyPagerAdapter extends FragmentPagerAdapter { 

    // fragments to instantiate in the viewpager 
    private List<Fragment> fragments; 

    // constructor 
    public MyPagerAdapter(FragmentManager fm,List<Fragment> fragments) { 
     super(fm); 
     this.fragments = fragments; 
    } 

    // return access to fragment from position, required override 
    @Override 
    public Fragment getItem(int position) { 
     return this.fragments.get(position); 
    } 

    // number of fragments in list, required override 
    @Override 
    public int getCount() { 
     return this.fragments.size(); 
    } 

} 
+0

解決策を以下の回答として投稿して、未回答のリストからこれを取り除くことができます。ありがとう。 –

答えて

4

!!!【課題!!!

これはここのベストプラクティスであるかどうかはわかりませんが、私は問題を解決しました。これに感謝しています。それを共有して、必要な人を助けたいと思います。 アクションバーは「オリジナル」なので、ABSに合わせて少しカスタマイズする必要がありました。 - このトピックにhttp://lomza.totem-soft.com/tutorial-actionbarsherlock-tabs-viewpager-listfragment-with-tab-listeners-and-more/

import java.util.ArrayList; 
    import java.util.Arrays; 
    import android.content.Context; 
    import android.content.Intent; 
    import android.os.Bundle; 
    import android.support.v4.app.Fragment; 
    import android.support.v4.app.FragmentPagerAdapter; 
    import android.support.v4.app.FragmentTransaction; 
    import android.support.v4.view.ViewPager; 
    import android.util.Log; 
    import android.view.View; 
    import android.widget.ArrayAdapter; 
    import com.actionbarsherlock.app.ActionBar; 
    import com.actionbarsherlock.app.ActionBar.Tab; 
    import com.actionbarsherlock.app.SherlockFragmentActivity; 
    import com.actionbarsherlock.view.Menu; 
    import com.actionbarsherlock.view.MenuInflater; 
    import com.actionbarsherlock.view.MenuItem; 



    public class MatchRugbyFragments extends SherlockFragmentActivity implements View.OnClickListener, View.OnLongClickListener{ 


public static ArrayList<String> commentary; 

public static ArrayAdapter<String> adapter; 

private ViewPager mViewPager; 
private TabsAdapter mTabsAdapter; 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);  
    setContentView(R.layout.fragments_rugby); 


    String[] array = {}; 
    commentary = new ArrayList<String>(); 
    commentary.addAll(Arrays.asList(array)); 

    adapter = new ArrayAdapter<String>(this, 
      R.layout.list_item_commentary, commentary); 



    mViewPager = new ViewPager(this); 
    mViewPager.setId(R.id.pager); 
    setContentView(mViewPager); 
    final ActionBar bar = getSupportActionBar(); 
    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
    bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE); 
    bar.setHomeButtonEnabled(true); 


    mTabsAdapter = new TabsAdapter(this, mViewPager); 
    mTabsAdapter.addTab(bar.newTab().setText(""+"Comandi"), 
      MatchRugbyButtonFragment.class, null); 
    mTabsAdapter.addTab(bar.newTab().setText(""+"Riassunto"), 
      MatchRugbySummaryFragment.class, null); 


} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putInt("tab", getActionBar().getSelectedNavigationIndex()); 
} 

//Comandi per il click prolungato 
public boolean onLongClick(View view) { 

    return false; 
} 


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

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    case android.R.id.home: 
     // app icon in action bar clicked; go home 
     Intent intent = new Intent(this, SportScoutActivity.class); 
     intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     startActivity(intent); 
     return true; 
    default: 
     return super.onOptionsItemSelected(item); 
    } 
} 
public static void addCommentaryRow(String s){ 
    adapter.add(s); 

} 

public static String commentaryToString(){ 
    String sAdapter= adapter.toString(); 
    return sAdapter; 
} 

public void onClick(View arg0) { 


} 



/** 
* @return the commentary 
*/ 
public ArrayList<String> getCommentary() { 
    return commentary; 
} 



/** 
* @param commentary the commentary to set 
*/ 
public void setCommentary(ArrayList<String> commentary) { 
    MatchRugbyFragments.commentary = commentary; 
} 



/** 
* @return the adapter 
*/ 
public ArrayAdapter<String> getAdapter() { 
    return adapter; 
} 



/** 
* @param adapter the adapter to set 
*/ 
public void setAdapter(ArrayAdapter<String> adapter) { 
    MatchRugbyFragments.adapter = adapter; 
} 





public static class TabsAdapter extends FragmentPagerAdapter 
implements ActionBar.TabListener, ViewPager.OnPageChangeListener { 
    private final Context mContext; 
    private final ActionBar mActionBar; 
    private final ViewPager mViewPager; 
    private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>(); 

    static final class TabInfo { 
     private final Class<?> clss; 
     private final Bundle args; 

     TabInfo(Class<?> _class, Bundle _args) { 
      clss = _class; 
      args = _args; 
     } 
    } 

    public TabsAdapter(SherlockFragmentActivity activity, ViewPager pager) { 
     super(activity.getSupportFragmentManager()); 
     mContext = activity; 
     mActionBar = activity.getSupportActionBar(); 
     mViewPager = pager; 
     mViewPager.setAdapter(this); 
     mViewPager.setOnPageChangeListener(this); 
    } 

    public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args) { 
     TabInfo info = new TabInfo(clss, args); 
     tab.setTag(info); 
     tab.setTabListener(this); 
     mTabs.add(info); 
     mActionBar.addTab(tab); 
     notifyDataSetChanged(); 
    } 


    public int getCount() { 
     return mTabs.size(); 
    } 

    public Fragment getItem(int position) { 
     TabInfo info = mTabs.get(position); 
     return Fragment.instantiate(mContext, info.clss.getName(), info.args); 
    } 


    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 
    } 


    public void onPageSelected(int position) { 
     mActionBar.setSelectedNavigationItem(position); 
    } 


    public void onPageScrollStateChanged(int state) { 
    } 


    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
     mViewPager.setCurrentItem(tab.getPosition()); 
     Log.v("TAG", "clicked"); 
     Object tag = tab.getTag(); 
     for (int i=0; i<mTabs.size(); i++) { 
      if (mTabs.get(i) == tag) { 
       mViewPager.setCurrentItem(i); 
      } 
     } 
    } 




    public void onTabUnselected(Tab tab, android.app.FragmentTransaction ft) {} 

    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 


    } 

    public void onTabReselected(Tab tab, FragmentTransaction ft) { 


    } 


} 
    } 
2

が、私はここにチュートリアルを書いた: は、ここにタブと(自動​​的にアクションバーの内側または外側のタブを置くことを含む)旗上げのあらゆる側面を扱うfinalクラス、です。基本的な実装は、Davidの記事のものと非常に似ています。おそらく、それは誰かにとって有益でしょう;

+0

ここに回答の関連部分を含めてください。あなたのブログへのリンクをバックアップ/詳細情報としてのみ使用してください – ChrisF