Почему моя вкладка Android не работает должным образом? - PullRequest
1 голос
/ 07 мая 2011

У меня есть TabActivity, в котором есть TabHost с двумя вкладками.Каждая вкладка имеет свое собственное назначение.Кажется, что onResume () намерения срабатывает, прежде чем я могу определить, была ли изменена вкладка.Как я могу решить эту проблему?

Код TabActivity:

public class TabHostActivity extends TabActivity {
    static final int SHOW_SHARE_ACTIVITY = 0;
    static final int SHOW_LOGIN_ACTIVITY = 1;

    private TabHost tabHost;
    private ImageButton composeImageButton;
    private SharedPreferences prefs;
    private Bundle b;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.tabhostactivity);       
        prefs = getSharedPreferences(Constants.PREFS_NAME, 0);
        //Setup the ActionBar
        composeImageButton = (ImageButton) findViewById(R.id.composeImageButton);
        composeImageButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if(prefs.getBoolean("isLoggedIn", false))
                {
                    showShareActivity();
                }
                else
                {
                    Intent intent = new Intent(TabHostActivity.this, LoginActivity.class);
                    startActivityForResult(intent, SHOW_LOGIN_ACTIVITY);
                }
            }
        });

        b = new Bundle();
        //Setup the Tabs
        Resources res = getResources(); // Resource object to get Drawables
        tabHost = getTabHost();  // The activity TabHost
        tabHost.setOnTabChangedListener(new OnTabChangeListener() {
               @Override
              public void onTabChanged(String arg0) {
                   if(tabHost.getCurrentTab() == 0) //Check if the Watchlist tab was clicked so we can prompt login
                   {
                        //Toast toast = Toast.makeText(getApplicationContext(), "TRENDING = YES", Toast.LENGTH_SHORT);
                        //toast.show();
                        b.putBoolean("isTrendingTab",true);
                   }
                   else
                   {
                       Toast toast = Toast.makeText(getApplicationContext(), "TRENDING = NO", Toast.LENGTH_SHORT);
                       toast.show();
                       b.putBoolean("isTrendingTab",false);
                   }
              }     
        });  

        TabHost.TabSpec spec;  // Resusable TabSpec for each tab
        Intent intent;  // Reusable Intent for each tab

        // Create an Intent to launch an Activity for the tab (to be reused)
        intent = new Intent().setClass(this, ARActivity.class);
        intent.putExtras(b);

        // Initialize a TabSpec for each tab and add it to the TabHost
        spec = tabHost.newTabSpec("trending").setIndicator("Trending",res.getDrawable(R.drawable.icon)).setContent(intent);
        tabHost.addTab(spec);

        // Do the same for the other tabs
        intent = new Intent().setClass(this, WatchlistActivity.class);
        intent.putExtras(b);
        spec = tabHost.newTabSpec("watchlist").setIndicator("Watchlist",res.getDrawable(R.drawable.icon)).setContent(intent);
        tabHost.addTab(spec);

        tabHost.setCurrentTab(0);
    }

    private void showShareActivity()
    {
        Intent intent = new Intent(TabHostActivity.this, ShareActivity.class);
        startActivityForResult(intent, SHOW_SHARE_ACTIVITY);
    }
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(requestCode == SHOW_LOGIN_ACTIVITY)
        {
            //Login was successful so lets show the compose box!
            if (resultCode == RESULT_OK) {
                showShareActivity();
            }
        }
    }
}

Вот onResume в намерении для одного из моих действий:

public void onResume()
    {
        super.onResume();

        Bundle bundle = getIntent().getExtras();

        if(bundle.getBoolean("isTrendingTab"))
        {
            Toast toast = Toast.makeText(getApplicationContext(), "TRENDING!", Toast.LENGTH_SHORT);
            toast.show();
        }
        else
        {
            Toast toast = Toast.makeText(getApplicationContext(), "WATCHLIST!", Toast.LENGTH_SHORT);
            toast.show();
        }
    }

Ответы [ 4 ]

1 голос
/ 13 мая 2011

Если я правильно понял, проблема в том, что вы пытаетесь поставить

b.putBoolean("isTrendingTab",true); 

(или false) для намерения, которое вы собираетесь запустить, обнаружив изменение.

Это неправильный подход.

Событие изменения будет всегда происходить после запуска действия, вам следует придерживаться другой логики. Вы должны переосмыслить это.

0 голосов
/ 14 мая 2011

Нет необходимости использовать onTabChanged ().

Вот как я это делаю в своем приложении (с некоторыми вставленными вами значениями).Я добавляю логический флаг к цели, а не дополнительный пакет:

Intent intent = new Intent(action) // see notes below about "action"
    .setClass(this, ARActivity.class)
    .putExtra("isTrendingTab", true); 
TabHost.TabSpec spec = tabHost.newTabSpec("trending")
    .setIndicator("trending", getResources().getDrawable(drawableId))
    .setContent(intent);
tabHost.addTab(spec);

Затем в onResume ():

if (getIntent().getBooleanExtra("isTrendingTab", false)) {...

я обнаружил, что при использовании одного класса для нескольких вкладок,Мне приходилось различать их по разным строкам action в каждом конструкторе Intent, как указано выше.В противном случае он не будет создавать новое действие при переключении между вкладками одного и того же класса.Похоже, вы этого не делаете (пока), так что вы можете продолжать это делать.Я думал, что упомяну это, так как прохождение isTrendingTab предполагает, что вы, возможно, направлялись по этому маршруту.

0 голосов
/ 13 мая 2011

Oncreate вашего класса ARActivity.class будет вызываться перед вашим методом onresume хоста вкладок.

Так что делайте все, что вы хотите, в своей ARActivity.

Также, поскольку ваш tabHost.setCurrentTab (0);Ваша стартовая вкладка всегда будет ARActivity.

И если вы хотите активировать код в зависимости от смены вкладки, выясните, на какой вкладке вы находитесь, используя основной вкладок ontabchange и используйте идентификатор, а затем отправьте запрос внутреннему получателю вещания.

if (tabHost.getCurrentTab() == 0) {
                    i.setAction(getString(R.string.br_refresh_home_tab));
                    sendBroadcast(i);
                } else {
                    i.setAction(getString(R.string.br_refresh_sports_tab));
                    sendBroadcast(i);
                }

В вашей ARActivity,

protected class RefreshList extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(
                    getString(R.string.br_refresh_home_tab))) {


            }
        }
    }
0 голосов
/ 13 мая 2011

Вы смотрели на жизненный цикл деятельности? Резюме вызывается, когда также создается действие, и строка bundle.getBoolean ("isTrendingTab") не имеет значения по умолчанию, если оно еще не установлено ...

Можете ли вы сначала установить в onCreate значение по умолчанию? Я думаю, что это ваша проблема. Код немного неаккуратный. Вы пытаетесь передать переменные каждому действию, но они все еще существуют в действии вкладки. Представления были бы лучшим методом, поэтому все они видят одни и те же переменные в активности вкладок.

...