Soru Android TabWidget mevcut sekmeyi tıkladı


Bu sekme geçerli sekme olduğunda bir sekmede onclick olayı tetikleyebilmenin yolunu bulmaya çalışıyorum.

Bu şekilde denemedim (pek çok diğerleri arasında).

public void onTabChanged(String tabId) {
    Log.d(this.getClass().getName(), ">>>>>>>>>>>>>>>>>>>>>>>> tabId: " + tabId);

    int tabs = getTabWidget().getChildCount();
    Log.d(this.getClass().getName(), "tabs: " + tabs);
    for(int i=0; i<tabs; i++){
        View tab = getTabWidget().getChildAt(i);
        if(i==tabHost.getCurrentTab()){
            Log.d(this.getClass().getName(), "tab: " + i);
            tab.setOnClickListener(this);
        }else{
            tab.setOnClickListener(null);
            tab.getOnFocusChangeListener();
        }
    }   
}

mesele şu ki onClickListener için null Yani, bir sekmeyi bir sonraki tıkladığımda hiçbir şey olmuyor, ama bende normal sekme davranışı.

Dışarıda bir fikrin var mı?


35
2017-12-02 16:48


Menşei


"Bu sekme geçerli sekme olduğunda bir sekmede onclick olayı tetikleyebilmenin yolunu bulmaya çalışıyorum." - Bu çok keşfedilebilir bir UI modeli değil. Kullanıcılar mevcut sekmede herhangi bir şey yapmak için bir dokunuş beklemezler. Yaklaşımınızı tekrar gözden geçirmenizi tavsiye ederim. - CommonsWare
Sana katılıyorum, müşteri dozum: / - 0m4r
Her sekmenin kullanıcı için talimatları olduğu ve tekrar gösterilecek talimatlar için sekmeyi tekrar tıklayabilmesini istiyorum benzer bir durum var. sanırım alışılmadık bir desen ama yönünü kolayca gözden geçirebilmek için düşündüğüm tek şey - dylan murphy
Bu iş parçasındaki çözümlerin çoğunu denedikten sonra, bu sorunu en az 5 dakika içinde çözdüm. bu Cevap. - Hugo


Cevaplar:


Sekme dinleyicisi için birçok çözümden sonra çok basit bir çözüm buldum ...

getTabHost().setOnTabChangedListener(new OnTabChangeListener() {

@Override
public void onTabChanged(String tabId) {

int i = getTabHost().getCurrentTab();
 Log.i("@@@@@@@@ ANN CLICK TAB NUMBER", "------" + i);

    if (i == 0) {
            Log.i("@@@@@@@@@@ Inside onClick tab 0", "onClick tab");

    }
    else if (i ==1) {
            Log.i("@@@@@@@@@@ Inside onClick tab 1", "onClick tab");
    }

  }
});

50
2017-10-13 06:39



Bu OPs problemini çözmez: Bu sadece sekme değiştiğinde ve aynı sekmeye tıklandığında çağrılmaz. - dhaag23
Teşekkürler adamım, uzun ve çılgın bir projeyi bitirmeme yardım ettin. - IamStalker
@Chirag_CID harika cevap :-), son 3 gün boyunca takıldım ve bu cevap benim gerçek problemimi çözdü;) - Zubair Ahmad Khan
@ dhaag23: Tekrar tıklamaktan kaçınmak için mevcut sekmeyi devre dışı bırakmalısınız. Kullanıcılara daha aşina olur. - Huy Tower
@TranDucHuy - engelli bir sekme, kullanıcıların istediği veya bekleyeceği bir şey olmayabilir - hepsi kullanım durumuna bağlıdır, ve bahsettiğim gibi, bu sorulan şey değil. - dhaag23


Bu konuda çok düşündükten sonra, çözüm düşündüğümden daha kolay oldu. Yaptığım şey sadece TabHost'u genişleten ve setCurrentTab yöntemini geçersiz kılan yeni bir alt sınıf oluşturmaktı:

package com.mycompany.Views;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.TabHost;
import android.widget.Toast;

public class ReclickableTabHost extends TabHost {

    public ReclickableTabHost(Context context) {
        super(context);
    }

    public ReclickableTabHost(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public void setCurrentTab(int index) {
        if (index == getCurrentTab()) {
            // FIRE OFF NEW LISTENER
        } else {
            super.setCurrentTab(index);
        }
    }
}

Yeni tablonuzu tipik TabHost yerine kullanmak için sadece xml dosyanızı düzenleyin:

<FrameLayout
    android:layout_height="match_parent"
    android:layout_width="0dip"
    android:layout_weight=".8">

    <com.myCompany.Views.ReclickableTabHost
        android:id="@android:id/tabhost"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:visibility="gone">

        <LinearLayout
            android:orientation="vertical"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">

            <TabWidget
                android:id="@android:id/tabs"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:background="@drawable/tab_unselected_holo"/>
            <FrameLayout
                android:id="@android:id/tabcontent"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent">
            </FrameLayout>

        </LinearLayout>

    </com.myCompany.Views.ReclickableTabHost>

Bu yardımcı olur umarım...


23
2018-02-15 21:31



En güvenilir çözüm gibi görünüyor. Teşekkürler Steve. - dhaag23
Mükemmel cevap. ekledim public interface OnReClickListener { public void onReClick(int index); } bir ve ivar private OnReClickListener onReClickListener; (artı alıcılar ve ayarlayıcılar) yanı sıra bu kodu dinleyici ateş etmek için: if (null != onReClickListener) { onReClickListener.onReClick(index);} Umarım yardımcı olur. - Moritz
büyük cevap adamı. - maddy d
Dinleyiciyi bilgilendirmeden önce isShown () kontrolünü eklemeniz de önemlidir. Çünkü eğer kullanıcı cihazı kilitler / kilidini açarsa android setCurrentTab'ı çağırır. - Oleksandr


Bir çözüm buldum sanırım, burada örnek bir kod takip ediyor:

    intent = new Intent(this, HomeGroup.class);
    View tab1 = _inflater.inflate(R.layout.custom_tab_1,null);
    homeTab.setTag("Tab1");
    spec = tabHost.newTabSpec("Tab1").setIndicator(tab1).setContent(intent);
    tabHost.addTab(spec);

    View tab2 = _inflater.inflate(R.layout.custom_tab_2,null);
    homeTab.setTag("Tab2");
    spec = tabHost.newTabSpec("Tab2").setIndicator(tab2).setContent(intent);
    tabHost.addTab(spec);

    View tab3 = _inflater.inflate(R.layout.custom_tab_3,null);
    homeTab.setTag("Tab3");
    spec = tabHost.newTabSpec("Tab3").setIndicator(tab3).setContent(intent);
    tabHost.addTab(spec);

    tabHost.setOnTabChangedListener(this);

    //click on seleccted tab
    int numberOfTabs = tabHost.getTabWidget().getChildCount();
    for(int t=0; t<numberOfTabs; t++){
        tabHost.getTabWidget().getChildAt(t).setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if(event.getAction()==MotionEvent.ACTION_UP){

                    String currentSelectedTag = MainTab.this.getTabHost().getCurrentTabTag();
                    String currentTag = (String)v.getTag();
                    Log.d(this.getClass().getSimpleName(), "currentSelectedTag: " + currentSelectedTag + " currentTag: " + currentTag);
                    if(currentSelectedTag.equalsIgnoreCase(currentTag)){
                        MainTab.this.getTabHost().setCurrentTabByTag(currentTag);
                        String newSelectedTabTag = MainTab.this.getTabHost().getCurrentTabTag();
                        if(newSelectedTabTag.toLowerCase().indexOf("tab1")!=-1){
                            //do smthg
                        }else if(newSelectedTabTag.toLowerCase().indexOf("tab1")!=-1){
                            //do smthg
                        }else if(newSelectedTabTag.toLowerCase().indexOf("tab3")!=-1){
                            //do smthg
                        }
                        return true;
                    }
                }
                return false;
            }
        });
    }       

Muhtemelen bunu geliştirmek mümkündür, ama bu benim için iş yapar!


20
2018-02-04 11:46



v.getTag () benim için null döndürür. - neobie
Bir etiket ayarlamanız gerekiyor, aksi halde boş ... - 0m4r
@ 0m4r ........ bu soruya bakabilirsiniz ..... stackoverflow.com/q/19269322/2825729
@ 0m4r - HomeTab'ı neyin ifade ettiğini söyleyebilir misiniz? - Ria
@Ria homeTab bir sekme düğmesine bastığımda görüntülenecek görünümdür (büyük olasılıkla yukarıdaki kod parçasında, daha sonra bir homeTab'ımın bir kesim ve geçmiş hatası olması gerçeği ....) - 0m4r


Çirkin düzeltme: onClickListener'da şunu ekleyin: tabHost.SetCurrentTab(OtherTab); tabHost.SetCurrentTab(CurrentTab); Diğer Sekmenin dizininde, sekmeler altındaki en basit görünümü kullanıyorum.

Not; Müşteriler her zaman uygulamalarının farklı olmasını isterler :)

Kullandığım kod budur (yalnızca 2 sekme Tab1 ve Tab2):

 getTabWidget().getChildAt(1).setOnClickListener(new OnClickListener() { 
            @Override 
            public void onClick(View v) { 

                Log.d(TAG,"1"+getTabHost().getCurrentTabTag());

                if (getTabHost().getCurrentTabTag().equals("Tab2")) { 
                    Log.d(TAG,"2");

                    tabHost.setCurrentTab(0);                                    
                    tabHost.setCurrentTab(1);

                } else {
                    tabHost.setCurrentTab(1);
                }
            } 
        });

14
2017-12-03 20:55



"Diğer Sekmenin indeksi için en basit görünümü sekmelerin altında kullanıyorum" ile ne demek istiyorsun? - 0m4r
Ben senin çözümünü denedim ama hala problemim var. overrriding sekmesindeki varsayılan onClick etkinliği geçersiz kılma varsayılan davranış ... ve null olarak ayarlayarak onClick olayını hiç kaldıramazsınız .... bu nedenle yardımınız için teşekkürler, ancak sekme için tüm onClick olayını yeniden yazmadığım sürece çözümünüzü kullanamayacağımı düşünüyorum: / - 0m4r
Bazı örnek kod ekledim. - Lyubomir Todorov
iki sekmeyle yararlı, ikiden fazla ile nasıl yönetileceğini bilmiyorum :) Ama yine de teşekkürler! - 0m4r
bunun yerine onTouchListener'ı geçersiz kılın ve onboard içinde false değerini döndürün, OnClick'in kullanılması sekmelerin değişmemesine neden olur - Jimmar


Sorun şu ki setOnTabChangedListener seçilen sekmeye tıkladığınızda yanmaz ve OnClickListener sekmesinde, normal sekme davranışını kaybedersiniz.

Yani kolay bir çözüm koymaktır OnClickListener sekmesinde ve içinde, bu geçerli sekme olduğunu programatik olarak ayarlayın.

İle TabHost:

getTabWidget().getChildAt(0).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // custom code
        tabHost.setCurrentTab(0);                                    
    }
});

İle TabLayout

tabLayout.getTabAt(0)setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                    // custom code
                    TabLayout.Tab tab  = tabLayout.getTabAt(0);
                    tab.select();
                }
            }
        });

5
2018-02-24 12:01



teşekkürler bana yardım et - Jatin Patel


Eğer denemek istersen android.support.design.widget.TabLayoutbunu şöyle yapabilirsin:

tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
   @Override public void onTabSelected(Tab tab) {

   }

   @Override public void onTabUnselected(Tab tab) {

   }

   @Override public void onTabReselected(Tab tab) {

   }
});

3
2017-12-09 17:33



Hey @AmiAram, teşekkürler senin düzenlemek. Ne yazık ki, geçmedi. Ama bu iyi bir öneri ve cevabımı bununla değiştirdim! - Yuchen Zhong


mTabHost.setOnTabChangedListener(new OnTabChangeListener() {

        @Override
        public void onTabChanged(String tabId) {

            int i = mTabHost.getCurrentTab();
            mTabHost.getTabWidget().getChildAt(i)
                    .setBackgroundColor(Color.parseColor("#014a68"));

            //int m = mTabHost.getChildCount();
            for (int j = 0; j <=3; j++) {
                if (j != i)
                    mTabHost.getTabWidget()
                            .getChildAt(j)
                            .setBackgroundColor(Color.parseColor("#000000"));
            }


        }
    });

1
2017-11-01 09:22





Özel bir sekme düzeniniz varsa, bunu özel görünümünüze eklemeniz gerekebilir, sorunumu çözdü:

android:duplicateParentState="true"

0
2018-04-28 12:42