Ho anche affrontato stessa applicazione problem.My ha tre schede e ogni scheda ha per spostare sulla scheda successiva e precedente. Non trovo alcun metodo per abilitare o disabilitare tab.
Ho utilizzato classe DataSer per mantenere la posizione della scheda e il valore booleano precedentemente selezionati per determinare la selezione della scheda. Se il flag booleano è true, l'utente ha premuto il pulsante next/previous. In caso contrario, l'utente sta tentando di selezionare la scheda premendo che non è consentita.
Ho utilizzato il gestore per la selezione della scheda. Dentro il frammento quando l'utente fa clic sul pulsante successivo Trasmetto quella richiesta. La richiesta di trasmissione ha un parametro intero che è la posizione della scheda successiva o precedente che vogliamo impostare. codice all'interno frammento è:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
View rootView = inflater.inflate(R.layout.first_tab_fragment, container, false);
next = (Button)rootView.findViewById(R.id.nextbutton);
next.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent("TAB_CLICKED");
Bundle bundle = new Bundle();
bundle.putInt(MainActivity.POSITION,1);
intent.putExtras(bundle);
getActivity().sendBroadcast(intent);
}
});
return rootView;
}
ho usato CustomViewPager invece di ViewPager per evitare scheda strisciata. classe CustomViewPager è:
public class CustomViewPager extends ViewPager {
private boolean enabled;
public CustomViewPager(Context context) {
super(context);
}
public CustomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
if (this.enabled) {
return super.onTouchEvent(event);
}
return false;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
if (this.enabled) {
return super.onInterceptTouchEvent(event);
}
return false;
}
public void setPagingEnabled(boolean enabled) {
this.enabled = enabled;
}
}
All'interno metodo OnCreate di MainActivity.java aggiungere questo due linee: codice
viewPager = (CustomViewPager) findViewById(R.id.pager);
viewPager.setPagingEnabled(false);
Di seguito è restanti da MainActivity.java:
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
Log.d("MainActivity","onTabSelected");
if(setter.getFlag() == true)
{
viewPager.setCurrentItem(setter.getposition());
}
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
Log.d("MainActivity","onTabUnselected");
//handler.sendEmptyMessage(0);
Message message = new Message();
message.arg1 = setter.getposition();
handler.sendMessage(message);
}
Handler handler = new Handler()
{
public void handleMessage(android.os.Message msg)
{
int arg1 = msg.arg1;
Log.d("arg1",arg1+"");
//viewPager.setCurrentItem(arg1);
mActionBar.setSelectedNavigationItem(arg1);
Log.d("handler","Inside handler");
}
};
BroadcastReceiver receiver = new BroadcastReceiver(){
public void onReceive(Context context, android.content.Intent intent) {
String action = intent.getAction();
Bundle bundle = intent.getExtras();
int position = bundle.getInt(MainActivity.POSITION);
Log.d("Action",action);
Log.d("position",position+"");
setter.setposition(position);
setter.setflag(true);
Message message = new Message();
message.arg1 = position;
handler.sendMessage(message);
};
};
}
Infine DataSetter.java:
public class DataSetter
{
int position;
boolean flag;
void setposition(int value)
{
position = value;
}
void setflag(boolean value)
{
flag = value;
}
int getposition()
{
return position;
}
boolean getFlag()
{
return flag;
}
}
Più potete trovare su: http://suhas1989.wordpress.com/2014/10/13/enable-or-disable-actionbar-tab-in-android/
Sì, capisco! Grazie. Ho il manager di aggiungere un comportamento bizzarro aggiungendo un controllo su TabListener, se "posso" modificare le schede che cambio, altrimenti selezionerò nuovamente l'ultima scheda = P – DaniloBertelli
@DaniloBertelli La tua soluzione non è così semplice. Per aggiornare la scheda selezionata Visualizza correttamente la tua "riselezione della scheda più recente" dovrà essere in una Runnable in coda tramite un post su una delle viste. Se vuoi veramente sapere perché, guarda in ScrollingTabContainerView # TabClickListener.onClick - poiché la chiamata a tab.select dovrà essere successiva alla chiamata a [child.setSelected] (http://is.gd/OCa2tF) in quel metodo. – Daniel
@Daniel non ci sono abbastanza caratteri in questa casella di input per esprimere i miei ringraziamenti. Fondamentalmente sto già usando un 'Handler' per vari compiti asincroni nel mio' Activity', ho semplicemente messo 'setSelectedNavigationItem()' come un nuovo '' Runnable'' con '' postAtFrontOfQueue() '' lì. Brillante! – foxx1337