Почему моя вкладка Android не работает должным образом?

#java #android #android-activity #android-intent #tabactivity

#java #Android #android-активность #android-намерение #tabactivity

Вопрос:

У меня есть 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();
        }
    }
  

Комментарии:

1. В чем проблема, с которой вы столкнулись? Да, onResume запускается до того, как вы сможете его увидеть, но с какой ошибкой / проблемой вы столкнулись?

2. Не самое простое решение, но использование представлений вместо действий в качестве содержимого вашей вкладки должно дать вам больше контроля.

Ответ №1:

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

 b.putBoolean("isTrendingTab",true); 
  

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

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

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

Ответ №2:

Вы смотрели на жизненный цикл Activity? Возобновление вызывается при создании действия, а строка bundle.getBoolean(«isTrendingTab») не имеет значения по умолчанию, если оно еще не было установлено…

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

Ответ №3:

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

Итак, выполняйте любую обработку, которую вы хотите в своей ARActivity.

Также, поскольку ваш TabHost.setCurrentTab(0); вашей начальной вкладкой всегда будет ARActivity.

И если вы хотите активировать код в зависимости от изменения вашей вкладки, определите, на какой вкладке вы находитесь, используя главный tabhost 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);
                }
  

В вашей активности,

 protected class RefreshList extends BroadcastReceiver {

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


            }
        }
    }
  

Ответ №4:

Нет необходимости использовать 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)) {...
  

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