I również w obliczu tej samej aplikacji problem.My zawiera trzy karty, a każda karta posiada przyciski, aby przenieść na kartę następnego i poprzedniego. Nie znajduję żadnej metody włączania lub wyłączania karty.
Użyłem klasy DataSetter do przechowywania poprzednio wybranej pozycji tabulacji i wartości boolowskiej w celu określenia wyboru tabulatora. Jeśli flaga logiczna ma wartość true, użytkownik nacisnął przycisk next/previous. W przeciwnym razie użytkownik próbuje wybrać kartę, naciskając tych, których nie akceptujemy.
Użyłem obsługi do wyboru tabulatora. Wewnątrz fragmentu, gdy użytkownik kliknie następny przycisk, rozgłaszam to żądanie. Żądanie rozgłoszeniowe ma wartość całkowitą, która jest pozycją następnej lub poprzedniej zakładki, którą chcemy ustawić. kodu wewnątrz fragmentu wynosi:
@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;
}
I stosuje CustomViewPager zamiast ViewPager zapobiec kartę przeciągnięcia. klasa CustomViewPager jest:
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;
}
}
Wewnątrz onCreate metody główną działalność.java dodać te dwie linie:
viewPager = (CustomViewPager) findViewById(R.id.pager);
viewPager.setPagingEnabled(false);
Poniżej pozostały kod z 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);
};
};
}
Wreszcie 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;
}
}
Więcej można znaleźć na: http://suhas1989.wordpress.com/2014/10/13/enable-or-disable-actionbar-tab-in-android/
Tak, widzę! Dzięki. Mam menedżera, aby dodać dziwne zachowanie, dodając czek na TabListener, jeśli "mogę" zmienić karty, które zmienię, jeśli nie, ponownie wybieram ostatnią kartę = P – DaniloBertelli
@DaniloBertelli Twoje obejście problemu nie jest proste. Aby zaktualizować wybraną kartę Wyświetl poprawnie "ponownie wybierz ostatnią kartę" będzie musiał być w kolejce w kolejności, którą można umieścić w poście na jednym z widoków. Jeśli naprawdę chcesz się dowiedzieć, dlaczego, to spójrz na ScrollingTabContainerView # TabClickListener.onClick - ponieważ twoja komenda tab.select będzie musiała być po wywołaniu [child.setSelected] (http://is.gd/OCa2tF) w tej metodzie. – Daniel
@Daniel Nie ma wystarczającej liczby znaków w tym polu wejściowym, aby wyrazić moje podziękowania. Zasadniczo używam 'Handler' do różnych asynchronicznych zadań w moim' Activity', po prostu umieszczam 'setSelectedNavigationItem()' jako nowe '' Runnable'' z '' postAtFrontOfQueue() '' tam. Znakomity! – foxx1337