2012-03-20 23 views
5

Şimdiye kadar birçok insan şimdiye kadar yaptığım gibi, ActionBarSherlock 4.0 kullanan uygulamamda FragmentTabsPager uygulamasını uyguluyorum. Ancak ben kayboldum.ActionBarSherlock ve FragmentTabsPager

Google'ın küçük fikirlerinin, planlarının ve yöntemlerinin tüm parçaları ve parçaları beni şaşırtıyor. Kimse benim koduma bir göz atabilir ve bana bu şekilde devam ederse, işe yaraması için yardım ederek, onlara binlerce kez teşekkür ederim: D.

Bir ViewPager için bir başlangıç ​​başlangıcı olan başka bir projem var, ancak Sekmeler, özellikle manzara ve tabletlerde ActionBar'da oldukları için daha iyi karışıyor.

Kodum tüm fermuarını ve buraya gitmeye hazır: http://dl.dropbox.com/u/21807195/Antonius%20College%202.zip

peşin!

+1

https://github.com/JakeWharton/ActionBarSherlock/blob/master/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentTabsPager.java –

cevap

6

Size her bir sekmeye bağlı bir ViewPager, TabListener ve Fragments sistemi olan kodumu göstereceğim. Bu ABS uygular, ancak henüz itibariyle hala Gingerbread çöker ve alt (gerçi, ICS üzerinde güzel çalışıyor):

import java.util.ArrayList; 
import library.DatabaseHandler; 
import org.json.JSONObject; 
import com.actionbarsherlock.R; 
import com.actionbarsherlock.app.ActionBar; 
import com.actionbarsherlock.app.ActionBar.Tab; 
import com.actionbarsherlock.app.SherlockFragmentActivity; 
import android.app.AlertDialog; 
import android.app.Dialog; 
import android.app.ProgressDialog; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.MenuItem.OnMenuItemClickListener; 
import android.view.View.OnClickListener; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Switch; 
import android.widget.TextView; 
import android.widget.Toast; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 
import android.support.v4.app.FragmentTransaction; 
import android.support.v4.view.ViewPager; 
import android.support.v4.view.ViewPager.OnPageChangeListener; 

public class Polling extends SherlockFragmentActivity { 
    private ViewPager mViewPager; 
    private TabsAdapter mTabsAdapter; 
    private final static String TAG = "21st Polling:"; 

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

     mViewPager = new ViewPager(this); 
     mViewPager.setId(R.id.pager); 
     setContentView(mViewPager); 
     ActionBar bar = getSupportActionBar(); 
     bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
     bar.setDisplayShowTitleEnabled(false); 
     bar.setDisplayShowHomeEnabled(false); 

     mTabsAdapter = new TabsAdapter(this, mViewPager); 
     mTabsAdapter.addTab(bar.newTab().setText(R.string.login), 
       LoginFragment.class, null); 
     mTabsAdapter.addTab(bar.newTab().setText(R.string.economics), 
       EconFragment.class, null); 
     mTabsAdapter.addTab(bar.newTab().setText(R.string.elections), 
       ElectionsFragment.class, null); 
     mTabsAdapter.addTab(bar.newTab().setText(R.string.politics), 
       PoliticsFragment.class, null); 
     mTabsAdapter.addTab(bar.newTab().setText(R.string.science), 
       ScienceFragment.class, null); 
     mTabsAdapter.addTab(bar.newTab().setText(R.string.finance), 
       FinanceFragment.class, null); 
     mTabsAdapter.addTab(bar.newTab().setText(R.string.religion), 
       ReligionFragment.class, null); 
     mTabsAdapter.addTab(bar.newTab().setText(R.string.military), 
       MilitaryFragment.class, null); 
     mTabsAdapter.addTab(bar.newTab().setText(R.string.international), 
       InternationalFragment.class, null); 
     Log.v(TAG, (String)bar.getTabAt(0).getText()); 

    } 
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 SherlockFragment getItem(int position) { 
      TabInfo info = mTabs.get(position); 
      return (SherlockFragment)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, FragmentTransaction ft) {} 

     public void onTabReselected(Tab tab, FragmentTransaction ft) {} 

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

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

Ve burada bir parçası gibi görünür:

package com.davekelley.polling; 

import com.actionbarsherlock.R; 
import com.actionbarsherlock.app.SherlockFragment; 

import android.support.v4.app.Fragment; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

public class MilitaryFragment extends SherlockFragment { 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     return inflater.inflate(R.layout.militaryfragment, container, false); 
    } 
} 

Benim son not Benim kodum hala başka bir soruna sahip olur: bireysel fragmanlar kullanıcı geri çekildikten sonra her zaman arayüzlerini yeniden yüklemez (bu, hangi uygulamanın/uygulamanın tamamlandığından bağımsız olarak ekrandan tüm uygulamanın kaldırılmasına neden olur, çünkü backStack'ım yok) . Yani şu an üzerinde çalışıyorum. Sanırım sıraladığım zaman, neden hala Gingerbread uygulamasının düzgün bir şekilde çalışmamasına karar vereceğim. Her iki durumda da, bu kodun size yardımcı olacağını umuyorum. İşte

bazı onClickListeners bir parçasıdır.

import com.actionbarsherlock.R; 
import com.actionbarsherlock.app.SherlockFragment; 
import android.app.Activity; 
import android.app.ProgressDialog; 
import android.content.Context; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TableLayout; 
import android.widget.TableRow; 
import android.widget.TextView; 
import android.widget.Toast; 

public class LoginFragment extends SherlockFragment { 

    Button loginButton; 
    Button registerButton; 
    Polling activity; 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.loginfragment, container, false); 

     return v; 
    } 

    public void onResume() { 
     super.onResume(); 
     Log.d("Econ", "onresume"); 

     loginButton = (Button) getActivity().findViewById(R.id.loginButton); 
     loginButton.setOnClickListener(loginListener); 
     registerButton = (Button) getActivity().findViewById(R.id.registerButton); 
     registerButton.setOnClickListener(registerListener); 

    } 

    public OnClickListener loginListener = new OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      if(loginButton.getText().toString() == "Log Out") { 

       activity.loginReport(2); 
       loginButton.setText(R.string.login); 
       //Remove user from dB sqllite when I know how 
      } 
      else { 
      Log.v("LoginF", "onclick"); 
      ProgressDialog progressDialog = new ProgressDialog(getActivity()); 
      progressDialog.setMessage("Logging in..."); 
      LoginTask loginTask = new LoginTask((Polling) getActivity(), progressDialog); 
      loginTask.execute(); 
      } 
     } 
    }; 


    public OnClickListener registerListener = new OnClickListener() { 
     @Override 
     public void onClick(View v) { 


      Log.v("Register", "onclick"); 
      ProgressDialog progressDialog = new ProgressDialog(getActivity()); 
      progressDialog.setMessage("Registering new user..."); 
      RegisterTask registerTask = new RegisterTask((Polling) getActivity(), progressDialog); 
      registerTask.execute(); 
      } 

    }; 

    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     this.activity = (Polling) activity; 
    } 

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


    } 

    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
    } 

    public void onStart() { 
     super.onStart(); 
     Log.d("Econ", "onstart"); 
    } 


    public void onPause() { 
     super.onPause();Log.d("Econ", "onpause"); 
    } 

    public void onStop() { 
     super.onStop(); 
     Log.d("Econ", "onstop"); 
    } 

    public void onDestroyView() { 
     super.onDestroyView(); 
     Log.d("Econ", "ondestroyview"); 
    } 

    public void onDestroy() { 
     super.onDestroy(); 
     Log.d("Econ", "ondestroy"); 

    } 

    public void onDetach() { 
     super.onDetach(); 
     Log.d("Econ", "ondetach"); 
    } 

} 

Eğer ASyncTask uzatmak sınıfları aslında bkz loginTask nesneleri - onlar benim sunucuya bağlanırken ve kayıt tanıtıcı/günlük

düşündüm Bir parça kod daha eklemek yararlı olacaktır. Bu, LoginFragment gibi parçalarımdan başka bir tanesidir, ancak bir UI'yi biraz daha farklı bir şekilde şişirir. Ben FragmentTabsPager Aktivite taşıdık ve gelen Fragments ilişkilendirmiş

public class EconFragment extends SherlockFragment { 

    private TableLayout questionContainer; 
    int pos = 0; 
    private String[] titles = {"The first title ", "hallo1","hallo2", "hallo3", 
      "hallo4", "hallo5","hallo6", "hallo7","hallo8", "hallo9"}; 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     Log.v("Econ", "onCreateView"); 
     View v = inflater.inflate(R.layout.econfragment, container, false); 
     questionContainer = (TableLayout) v.findViewById(R.id.questionContainer); 
     //bs 
     int leftMargin=5; 
     int topMargin=5; 
     int rightMargin=5; 
     int bottomMargin=5; 
     while (pos < 10) { 
     View question = inflater.inflate(R.layout.question, null); 
     question.setId(pos); 
     TextView title = (TextView) question.findViewById(R.id.questionTextView); 
     title.setText(titles[pos]); 
     Button charts = (Button) question.findViewById(R.id.chartsButton); 
     charts.setId(pos); 
     charts.setOnClickListener(chartsListener); 
     TableRow tr = (TableRow) question; 
     TableLayout.LayoutParams trParams = new TableLayout.LayoutParams(
       TableLayout.LayoutParams.MATCH_PARENT, 
       TableLayout.LayoutParams.WRAP_CONTENT); 
     trParams.setMargins(leftMargin, topMargin, rightMargin, bottomMargin); 
     tr.setLayoutParams(trParams); 
     Log.v("econ", "while loop"); 
     questionContainer.addView(tr); 
     pos++; 
     } 
     pos = 0; 
     return v; 
    } 
+0

Yanıtınız için teşekkür ederiz. Önümüzdeki haftaya bir bakacağım (eğer zamanım varsa ...) ve rapor vereceğim. Bana herşeyi ne zaman çalıştığını ve ne yapılması gerektiğini söyler misin? – DatBassie

+0

Elbette. Gingerbread'ın çöküşünün nedeni, 3.0 veya 4.0'da tanıtılan bir Switch widget'ını kullanmam çünkü Gingerbread'ın kodu çalıştırmasının hiçbir yolu yoktu. Bunu bir onay kutusuna geçirdim, Project-> Clean'i çalıştırdım ve işe yaradı. TabsAdapter kodumu orjinal defterime eklemeyi unuttum, bu yüzden şu an bunu düzenleyeceğim. – Davek804

+0

Teşekkürler! Ancak Fragmandaki tüm tıklamaları nasıl ele alıyorsunuz? (Evet, Fragmanlar beni cehennem gibi karıştırır ...) – DatBassie

4

: Aşağıda süre döngüde gördüklerinizi Sonunda, oldukça gördüğünüz kukla dize dizisi daha sunucudan her soruyu satın almak üzere bir ASyncTask içine başkanlık edecek ActionBarSherlock ve gerçek ActionBar Sekmelerini kullanmak için "Support4Demos" (Android Destek kitaplığı örneği). Örnek, Fragmanlar arasında geçiş yapmak için hem bir ViewPager hem de Tabs kullanan bir Etkinlik içerir. Fragmanlar üç çeşit ListView içerir. ICS'den Eclair'e (2.1) kadar test ettim. Kodu inceleyebilir veya http://code.google.com/p/sherlock-demo/ adresinden indirebilirsiniz.

+0

, kodu buradan yükleyemediğim başka bir yere koyabilir. "Bu projede şu anda indirme yok." –

+0

http://code.google.com/p/sherlock-demo/source/checkout adresine buradan ulaşabilirsiniz: http://code.google.com/p/sherlock-demo/source/browse/ – Sparky

+1

Bunu, çalışan bir EditText ve Button ve bir ListDialog gibi diğer özellikler için de yapabilir misiniz? Bütün bunlarla sorun ... Tabii ki, gelecekteki referans için de çok iyi :). – DatBassie

İlgili konular