2012-03-20 13 views
5

Jak wiele osób robi do tej pory, wdrażam aplikację FragmentTabsPager do mojej aplikacji, która używa ActionBarSherlock 4.0. Jednak jestem zagubiony.ActionBarSherlock i FragmentTabsPager

Fragmenty i wszystkie małe pomysły, plany i metody, które go otaczają, wprowadzają mnie w błąd. Gdyby ktoś mógł rzucić okiem na mój kod i przeprowadzić mnie przez to, zapewniając pomoc w jego działaniu, dziękuję im tysiąc razy: D.

Mam inny projekt z pewnym początkiem dla ViewPagera, ale Taby po prostu lepiej mieszają się, zwłaszcza z nimi w paskach akcji na pejzażu i tabletach.

Mój kod to wszystko spakowane i gotowe do przejść tutaj: http://dl.dropbox.com/u/21807195/Antonius%20College%202.zip

Dzięki z góry!

+1

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

Odpowiedz

6

Pokażę ci mój kod, który ma ViewPager, TabListener i system Fragmentów połączonych z każdą zakładką. Implementuje ABS, ale jak dotąd, nadal ulega awarii na Piernika i niższe (działa pięknie na ICS, choć):

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) {} 
    } 

A oto co jeden fragment wygląda tak:

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

moja ostatnia uwaga czy mój kod nadal ma jeszcze jeden problem: poszczególne fragmenty nie zawsze przeładowują swój interfejs po naciśnięciu przycisku wstecz (co powoduje usunięcie całej aplikacji z ekranu, niezależnie od tego, na której karcie/fragmencie są one włączone, ponieważ nie mam backStack) . Więc właśnie nad tym pracuję. Myślę, że kiedy już to posortuję, postaram się dowiedzieć, dlaczego nadal nie działa poprawnie Piernikarstwo. Tak czy si, mam nadzieję, że przejrzenie tego kodu pomoże ci.

Oto fragment z niektórych onClickListeners.

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

} 

obiektów loginTask że widoczne są rzeczywiście klas, które rozszerzają ASyncTask - poradzić sobie z podłączeniem do mojego serwera i rejestracji/logowania w

myślałem pomocne byłoby dodanie jeszcze jednego kodu. To kolejny z moich fragmentów, takich jak LoginFragment, ale nieco inaczej nadpisuje interfejs użytkownika. Ostatecznie, co można zobaczyć w pętli while poniżej, będzie kierował się w ASyncTask nabyć każde pytanie z serwera, zamiast manekina tablicy ciągów zobaczyc:

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

Dziękuję za odpowiedź. Przyjrzę się temu w nadchodzącym tygodniu (jeśli mam czas ...) i zgłoś się ponownie. Czy możesz mi również powiedzieć, kiedy wszystko działa i co trzeba zrobić? – DatBassie

+0

Pewnie. Powodem, dla którego rozbił się na Gingerbread, jest to, że używałem widżetu Switch, który został wprowadzony w wersji 3.0 lub 4.0, więc nie było możliwości, aby Gingerbread mógł uruchomić kod. Zmieniłem ten przełącznik na pole wyboru, uruchomiłem Project-> Clean i wszystko działało dobrze. Zapomniałem podać mój kod TabsAdapter w moim oryginalnym wpisie, więc teraz to zmienię. – Davek804

+0

Dzięki! Ale jak sobie radzisz ze wszystkimi kliknięciami itp. W Fragmentie? (Tak, Fragmenty mylą mnie jak diabli ...) – DatBassie

4

Mam przeniesiony na aktywny FragmentTabsPager i związanego fragmenty "Support4Demos" (przykładowa biblioteka pomocy technicznej systemu Android) do korzystania z ActionBarSherlock i prawdziwych zakładek ActionBar. Przykład zawiera działanie, które wykorzystuje zarówno ViewPager, jak i Tabs do przełączania się między Fragmentami. Fragmenty zawierają trzy rodzaje ListView. Przetestowałem go od ICS do Eclair (2.1). Możesz przeglądać lub pobrać kod pod adresem http://code.google.com/p/sherlock-demo/.

+0

możesz umieścić kod w innym miejscu, ponieważ nie mogę go pobrać. "Ten projekt nie ma obecnie żadnych pobrań." –

+0

Sprawdź źródło tutaj: http://code.google.com/p/sherlock-demo/source/checkout Przeglądaj źródło tutaj: http://code.google.com/p/sherlock-demo/source/browse/ – Sparky

+1

Czy możesz to zrobić również dla innych funkcji, takich jak działający EditText i Button oraz ListDialog? Masz kłopoty z tymi wszystkimi ... Oczywiście, jest to również dobre w przyszłości :). – DatBassie

Powiązane problemy