Tecnologia do Blogger.
RSS

Re: [androidbrasil-dev] Criar tabs com o ActionBarSherlock

Não tem esse método ! =S devo estar esquecendo de algo ou sendo muito desatento .....



package br.com.diegoampessan.myreport.utils;

import com.actionbarsherlock.app.ActionBar.Tab;

import android.app.Activity;
import android.app.FragmentManager;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;

public class TabListener<T extends Fragment> implements
com.actionbarsherlock.app.ActionBar.TabListener {

private Fragment mFragment;
private final Activity mActivity;
private final String mTag;
private final Class<T> mClass;

public TabListener(Activity activity, String tag, Class<T> clz) {
mActivity = activity;
mTag = tag;
mClass = clz;

mFragment = mActivity.getSupportFragmentManager().findFragmentByTag(mTag);
if (mFragment != null && !mFragment.isDetached()) {
FragmentTransaction ft = mActivity.getFragmentManager()
.beginTransaction();
ft.detach(mFragment);
ft.commit();
}
}

public void onTabSelected(Tab tab, FragmentTransaction ft) {

// Check if the fragment is already initialized
if (mFragment == null) {
// If not, instantiate and add it to the activity
mFragment = Fragment.instantiate(mActivity, mClass.getName());
ft.add(android.R.id.content, mFragment, mTag);
} else {
// If it exists, simply attach it in order to show it

ft.attach(mFragment);
}
}

public void onTabUnselected(Tab tab, FragmentTransaction ft) {
if (mFragment != null) {
// Detach the fragment, because another one is being attached
ft.detach(mFragment);
}
}

public void onTabReselected(Tab tab, FragmentTransaction ft) {
// User selected the already selected tab. Usually do nothing.
}

}


Em 23 de maio de 2012 09:35, luciofm <luciofm@gmail.com> escreveu:
mActivity.getSupportFragmentManager().findFragmentByTag()


Lúcio Maciel
luciofm@gmail.com


2012/5/23 Diego Ampessan <ampessann@gmail.com>
Lucio ! tentei fazer porem sem sucesso.... usei o código

     mFragment = mActivity.getFragmentManager().findFragmentByTag(mTag);
           
if (mFragment != null && !mFragment.isDetached()) {
               
FragmentTransaction ft = mActivity.getFragmentManager().beginTransaction();
                ft
.detach(mFragment);
                ft
.commit();
           
}


Porem estou usando o Fragment do android.support.v4 ... dai ele não deixa pede para eu usar o android.app.Fragment ... se eu mudo para ele ele da erro 

05-23 09:24:25.618: E/AndroidRuntime(9354): java.lang.NoSuchMethodError: android.app.Activity.getFragmentManager




Em 23 de maio de 2012 09:07, luciofm <luciofm@gmail.com> escreveu:

Diego, no construtor do seu TabListener, falta você procurar pela referencia de um possivel fragment já existente (e que o framework está fazendo o attach automaticamente).

mFragment = ft.findFragmentByTag(mTag)

com isso no onTabSelected o mFragment vai ser diferente de null e vai só attacha-lo, sem criar um novo



Lúcio Maciel
luciofm@gmail.com



2012/5/23 Diego Ampessan <ampessann@gmail.com>
Vamos ver por partes ...

@Gink fiz o teste aqui e o teclado desaparece, o que aconteceu comigo é ele não abrir de novo se eu mudar de aba na mesma orientação .... não sei o porque disso...

@Renato, eu uso a versão 410 API 15 da library import do Sherlock e no meu projeto uso a API 15 tambem porem meu manifest está da seguinte forma:

 <uses-sdk
        android:minSdkVersion="7"
        android:targetSdkVersion="15" />


funciona normalmente em aparelhos 2+


@Lucio, o que pode ser o erro dele estar gerando o fragment de novo e jogando em cima novamente ? Procurei e não descobri nenhuma solução para isso ... será a versão 4.1.0 do Sherlock ?




Em 22 de maio de 2012 23:10, rcsilva83@gmail.com <rcsilva83@gmail.com> escreveu:

Para usar o ActionBarSherlock 4, você deve definir a API level para 15 e terá compatibilidade para versões 2.1+.

No ABS 3, API level é 13 e compatibilidade para versões 1.6+.

Abraço!
--
Rodrigo

http://www.rodrigocarvalho.blog.br





2012/5/22 Renato Porto Puccini <renatoppuccini@gmail.com>
Como nunca usei ActionBar, la vai a pergunta aproveitando esse topico,

Pra eu usar o Sherlock tenho que criar um projeto api level 14+ ?
E quando usar Sherlock junto com a api de compatibilidade automaticamente ira funcionar em aparelhos de APIs mais antigos (2.2 por exemplo)?
correto?

Renato


2012/5/22 Gink Labrev <gink.labrev@gmail.com>
Diego,

Vc usa algum editText dentro de algum dos fragments das tabs ?
Notou que se alterar de aba, quando o teclado estiver em evidência, o teclado não desaparece ?

2012/5/22 Diego Ampessan <ampessann@gmail.com>
Entendi ! 

Valeu Lucio :)

2012/5/22 luciofm <luciofm@gmail.com>
Porque a SherlockActivity estende de Activity, e a não ser que você esteja usando em um API level > 11, você não terá acesso a Fragments direto da Activity, você precisa estender de FragmentActivity (ou no caso da sherlock de SherlockFragmentActivity).


Lúcio Maciel
luciofm@gmail.com



On Tue, May 22, 2012 at 10:13 AM, Diego Ampessan <ampessann@gmail.com> wrote:
Resolvi !!

mudei de :

public class MenuActivity extends SherlockActivity {


para:

public class MenuActivity extends SherlockFragmentActivity {


Agora o porque, não entendi ! mais funcionou .... 


2012/5/22 Diego Ampessan <ampessann@gmail.com>
Alguem?

Não consegui resolver ... 


2012/5/21 Diego Ampessan <ampessann@gmail.com>
Na 

actionBar.addTab(tab); ele estoura a exception

05-21 15:59:53.869: E/AndroidRuntime(15444): FATAL EXCEPTION: main
05-21 15:59:53.869: E/AndroidRuntime(15444): java.lang.RuntimeException: Unable to start activity ComponentInfo{br.com.diegoampessan.myreport/br.com.diegoampessan.myreport.ui.MenuActivity}: java.lang.NullPointerException
05-21 15:59:53.869: E/AndroidRuntime(15444): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
05-21 15:59:53.869: E/AndroidRuntime(15444): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
05-21 15:59:53.869: E/AndroidRuntime(15444): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
05-21 15:59:53.869: E/AndroidRuntime(15444): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
05-21 15:59:53.869: E/AndroidRuntime(15444): at android.os.Handler.dispatchMessage(Handler.java:99)
05-21 15:59:53.869: E/AndroidRuntime(15444): at android.os.Looper.loop(Looper.java:123)
05-21 15:59:53.869: E/AndroidRuntime(15444): at android.app.ActivityThread.main(ActivityThread.java:4627)
05-21 15:59:53.869: E/AndroidRuntime(15444): at java.lang.reflect.Method.invokeNative(Native Method)
05-21 15:59:53.869: E/AndroidRuntime(15444): at java.lang.reflect.Method.invoke(Method.java:521)
05-21 15:59:53.869: E/AndroidRuntime(15444): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
05-21 15:59:53.869: E/AndroidRuntime(15444): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
05-21 15:59:53.869: E/AndroidRuntime(15444): at dalvik.system.NativeStart.main(Native Method)
05-21 15:59:53.869: E/AndroidRuntime(15444): Caused by: java.lang.NullPointerException
05-21 15:59:53.869: E/AndroidRuntime(15444): at br.com.diegoampessan.myreport.utils.TabListener.onTabSelected(TabListener.java:28)
05-21 15:59:53.869: E/AndroidRuntime(15444): at com.actionbarsherlock.internal.app.ActionBarImpl.selectTab(ActionBarImpl.java:526)
05-21 15:59:53.869: E/AndroidRuntime(15444): at com.actionbarsherlock.internal.app.ActionBarImpl.addTab(ActionBarImpl.java:452)
05-21 15:59:53.869: E/AndroidRuntime(15444): at com.actionbarsherlock.internal.app.ActionBarImpl.addTab(ActionBarImpl.java:438)
05-21 15:59:53.869: E/AndroidRuntime(15444): at br.com.diegoampessan.myreport.ui.MenuActivity.onCreate(MenuActivity.java:31)
05-21 15:59:53.869: E/AndroidRuntime(15444): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
05-21 15:59:53.869: E/AndroidRuntime(15444): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
05-21 15:59:53.869: E/AndroidRuntime(15444): ... 11 more


2012/5/21 Gink Labrev <gink.labrev@gmail.com>
Em qual linha da classe TabListener. ocorre o NULL EXCEPTION?

2012/5/21 Diego Ampessan <ampessann@gmail.com>
Lucio, ta o Theme.Sherlock


  <activity
            android:name=".ui.MenuActivity"
            android:theme="@style/Theme.Sherlock" >
        </activity>

2012/5/21 luciofm <luciofm@gmail.com>
Qual o theme da activity ?


Lúcio Maciel
luciofm@gmail.com



On Mon, May 21, 2012 at 3:12 PM, Diego Ampessan <ampessann@gmail.com> wrote:
Pessoal, tenho essa classe implementada desta maneira mesmo ....

    public static class TabListener<T extends Fragment> implements ActionBar.TabListener {
   
private Fragment mFragment;
   
private final Activity mActivity;
   
private final String mTag;
   
private final Class<T> mClass;

   
/** Constructor used each time a new tab is created.
      * @param activity  The host Activity, used to instantiate the fragment
      * @param tag  The identifier tag for the fragment
      * @param clz  The fragment's Class, used to instantiate the fragment
      */

   
public TabListener(Activity activity, String tag, Class<T> clz) {
        mActivity
= activity;
        mTag
= tag;
        mClass
= clz;
   
}

   
/* The following are each of the ActionBar.TabListener callbacks */

   
public void onTabSelected(Tab tab, FragmentTransaction ft) {
       
// Check if the fragment is already initialized
       
if (mFragment == null) {
           
// If not, instantiate and add it to the activity
            mFragment
= Fragment.instantiate(mActivity, mClass.getName());
            ft
.add(android.R.id.content, mFragment, mTag);
       
} else {
           
// If it exists, simply attach it in order to show it
            ft
.attach(mFragment);
       
}
   
}

   
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
       
if (mFragment != null) {
           
// Detach the fragment, because another one is being attached
            ft
.detach(mFragment);
       
}
   
}

   
public void onTabReselected(Tab tab, FragmentTransaction ft) {
       
// User selected the already selected tab. Usually do nothing.
   
}
}
Logo tenho 

public class MenuActivity extends SherlockActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);

ActionBar actionBar = getSupportActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
actionBar.setDisplayShowTitleEnabled(false);

Tab tab = actionBar
.newTab()
.setText("teste ola")
.setTabListener(
new TabListener<DadosBasicosFragment>(this,
"teste ola", DadosBasicosFragment.class));

actionBar.addTab(tab);

tab = actionBar
.newTab()
.setText("teste 2")
.setTabListener(
new TabListener<DadosBasicosFragment>(this, "teste 2",
DadosBasicosFragment.class));

actionBar.addTab(tab);

}



Porem ele me da um NULL EXCEPTION no  actionBar na hora de adicionar o TAB .... alguem sabe porque ? acredito que seja no ActionBar actionBar = getSupportActionBar();

meu DadosBasicosFragment está implementado da seguinte forma, bem simples ...

public class DadosBasicosFragment extends Fragment {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub

View view = inflater.inflate(R.layout.main, null);

return view;
}
}



Alguma ideia?

-
Att.
Diego Ampessan
Microsoft MTA

www.diegoampessan.com.br


Os computadores são incrivelmente rápidos, precisos e burros; Os homens são incrivelmente lentos, imprecisos e brilhantes; Juntos, seu poder ultrapassa os limites da imaginação  - "Albert Einstein "





--
Att.
Diego Ampessan
Microsoft MTA

www.diegoampessan.com.br


Os computadores são incrivelmente rápidos, precisos e burros; Os homens são incrivelmente lentos, imprecisos e brilhantes; Juntos, seu poder ultrapassa os limites da imaginação  - "Albert Einstein "





--
Att.
Diego Ampessan
Microsoft MTA

www.diegoampessan.com.br


Os computadores são incrivelmente rápidos, precisos e burros; Os homens são incrivelmente lentos, imprecisos e brilhantes; Juntos, seu poder ultrapassa os limites da imaginação  - "Albert Einstein "




--
Att.
Diego Ampessan
Microsoft MTA

www.diegoampessan.com.br


Os computadores são incrivelmente rápidos, precisos e burros; Os homens são incrivelmente lentos, imprecisos e brilhantes; Juntos, seu poder ultrapassa os limites da imaginação  - "Albert Einstein "




--
Att.
Diego Ampessan
Microsoft MTA

www.diegoampessan.com.br


Os computadores são incrivelmente rápidos, precisos e burros; Os homens são incrivelmente lentos, imprecisos e brilhantes; Juntos, seu poder ultrapassa os limites da imaginação  - "Albert Einstein "





--
Att.
Diego Ampessan
Microsoft MTA

www.diegoampessan.com.br


Os computadores são incrivelmente rápidos, precisos e burros; Os homens são incrivelmente lentos, imprecisos e brilhantes; Juntos, seu poder ultrapassa os limites da imaginação  - "Albert Einstein "







--
Att.
Diego Ampessan
Microsoft MTA

www.diegoampessan.com.br


Os computadores são incrivelmente rápidos, precisos e burros; Os homens são incrivelmente lentos, imprecisos e brilhantes; Juntos, seu poder ultrapassa os limites da imaginação  - "Albert Einstein "





--
Att.
Diego Ampessan
Microsoft MTA

www.diegoampessan.com.br


Os computadores são incrivelmente rápidos, precisos e burros; Os homens são incrivelmente lentos, imprecisos e brilhantes; Juntos, seu poder ultrapassa os limites da imaginação  - "Albert Einstein "





--
Att.
Diego Ampessan
Microsoft MTA

www.diegoampessan.com.br


Os computadores são incrivelmente rápidos, precisos e burros; Os homens são incrivelmente lentos, imprecisos e brilhantes; Juntos, seu poder ultrapassa os limites da imaginação  - "Albert Einstein "

  • Digg
  • Del.icio.us
  • StumbleUpon
  • Reddit
  • RSS

0 comentários:

Postar um comentário