Как заставить действие начать с нуля? - PullRequest
2 голосов
/ 03 февраля 2012

Я уверен, что я делаю это по своей сути неправильно, но я решил спросить в любом случае.Казалось, я не нашел строгого ответа на это, и я делаю все ответы на такие вопросы, как это сказать.Итак, я думаю, что это как-то связано с фрагментами или что-то в этом роде.Я довольно новичок в разработке для Android, поэтому, пожалуйста, потерпите меня.

Итак, у меня есть просмотр галереи.Когда вы щелкаете один из элементов в этой галерее, он запускает намерение для Действия, которое отображает этот элемент в пейджере с другими элементами, окружающими его.Когда вы нажимаете кнопку «Домой» на панели действий или нажимаете кнопку «Назад», а затем выбираете другой вид галереи, который делает то же самое, новый отлично загружается.

Когда вы нажимаете «Домой», переходите в другое приложение,и долго удерживайте кнопку «Домой» и нажмите приложение, которое я есть, оно загружается нормально (хотя и не всегда в нужном месте, которое, как я полагаю, нужно добавить в saveInstanceState, но я отвлекся ..)

Однако, когда я нажимаю кнопку домой.Нажмите на значок запуска (который запускает mainActivity), а затем нажмите на одну из галерей, она показывает СТАРОЙ в действии.Это проблема, и я мог бы ее исправить, если бы мог заставить действие начинаться с нуля при сохранении всех рабочих функций.

В XML действие задано так:

<activity
    android:name=".NewsViewCatActivity"
    android:launchMode="singleTop"
    android:configChanges="orientation|keyboardHidden|screenSize|screenLayout|uiMode"
    android:theme="@style/Theme.BgsuNews" >
    <intent-filter>
        <action android:name="edu.bgsu.news.VIEW_CAT" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

Я вызываю намерение как таковое:

// Launch a News View Activity
Intent myIntent = new Intent(context,
        NewsViewCatActivity.class);
myIntent.putExtra("news", (Serializable)subcat);
myIntent.putExtra("title", catTitle);
myIntent.putExtra("pos", position);
myIntent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
startActivity(myIntent);

, и действие, вызывающее это новое действие / намерение, определяется следующим образом:

<activity
    android:name=".NewsActivity"
    android:clearTaskOnLaunch="true"
    android:configChanges="orientation|keyboardHidden|screenSize|screenLayout|uiMode"
    android:label="@string/shortcut_name"
    android:launchMode="singleInstance"
    android:theme="@style/Theme.BgsuNews" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

и сама моя деятельностьиспользует следующий код:

package edu.bgsu.news;

import java.io.Serializable;
import java.util.List;

import com.viewpagerindicator.CirclePageIndicator;

import edu.bgsu.news.api.NewsItem;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.ActionBar;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.Menu;
import android.support.v4.view.MenuItem;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.MenuInflater;
import android.view.Window;

public class NewsViewCatActivity extends FragmentActivity
{
    private static final String TAG = "BGSUNEWS";

    private ViewPager mViewPager;
    private MyFragmentPagerAdapter mMyFragmentPagerAdapter;
    private CirclePageIndicator mCircleIndicator;
    private List<NewsItem> news;
    private String title;
    private Integer pos;
    private String catID;
    private ActionBar actionBar;

    public void onNewIntent(Intent intent)
    {
        Log.i(TAG, "onNewIntent for NewsCatActivity");
        setIntent(intent);
        loadIt();
    }

    @SuppressWarnings("unchecked")
    private void loadIt()
    {
        news = null;
        Bundle extras = getIntent().getExtras();
        news = (List<NewsItem>) extras.get("news");
        title = (String) extras.get("title");
        pos = (Integer) extras.get("pos");
        catID = (String) extras.get("catID");
        if (mMyFragmentPagerAdapter != null)
            mMyFragmentPagerAdapter.notifyDataSetChanged();
        mViewPager.setCurrentItem(pos);
        actionBar.setTitle(title);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.news_view_menu, menu);
        NewsItem cNews = news.get(mViewPager.getCurrentItem());
        changeMenuItem(menu.findItem(R.id.news_fave), cNews.isFaved());
        return true;
    }

    public void onSaveInstanceState(Bundle savedInstanceState)
    {
        savedInstanceState.putSerializable("news", (Serializable) this.news);
    }

    @SuppressWarnings("unchecked")
    public void onRestoreInstanceState(Bundle savedInstanceState)
    {
        this.news = (List<NewsItem>) savedInstanceState.getSerializable("news");
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {
        NewsItem cNews;
        switch (item.getItemId())
        {
            case android.R.id.home:
                // app icon in action bar clicked; go home
                Intent intent = new Intent(this, NewsActivity.class);
                intent.putExtra("catID", catID);
                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
                intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
                startActivity(intent);
                finish();
                return true;
            case R.id.news_share:
                // Uri uri = Uri.parse(news.getLink());
                cNews = news.get(mViewPager.getCurrentItem());
                Intent sharingIntent = new Intent(
                        android.content.Intent.ACTION_SEND);
                sharingIntent.setType("text/plain");
                sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT,
                        cNews.getName() + " - " + cNews.getLink());
                sharingIntent.putExtra(android.content.Intent.EXTRA_TITLE,
                        cNews.getName());
                sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT,
                        "Shared: " + cNews.getName());
                startActivity(Intent.createChooser(sharingIntent, "Share "
                        + cNews.getName()));
                return true;
            case R.id.news_fave:
                cNews = news.get(mViewPager.getCurrentItem());
                if (cNews.isFaved())
                {
                    cNews.unFave();
                    Log.i(TAG, "Unfaved it!");
                    changeMenuItem(item, false);
                } else
                {
                    cNews.fave();
                    Log.i(TAG, "Faved it!");
                    changeMenuItem(item, true);
                }
                return true;
            case R.id.news_open:
                Intent intent1 = new Intent(Intent.ACTION_VIEW, Uri.parse(news
                        .get(mViewPager.getCurrentItem()).getLink()));
                startActivity(intent1);
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

    public void changeMenuItem(MenuItem item, boolean isFaved)
    {
        if (isFaved)
        {
            item.setIcon(R.drawable.ic_action_star_hl);
            item.setTitle(R.string.news_unfave);
        } else
        {
            item.setIcon(R.drawable.ic_action_star);
            item.setTitle(R.string.news_fave);
        }
    }

    public void onResume()
    {
        Log.i(TAG, "onResume for NewsCatActivity");

        runViewStuffs();
        loadIt();

        super.onResume();
    }

    public void onCreate(Bundle savedInstanceState)
    {
        Log.i(TAG, "onCreate for NewsCatActivity");
        requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_multiple_news);
        // onResume called
    }

    public void runViewStuffs()
    {
        actionBar = getSupportActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true);

        mViewPager = (ViewPager) findViewById(R.id.news_pager);
        mMyFragmentPagerAdapter = new MyFragmentPagerAdapter(
                getSupportFragmentManager());
        mViewPager.setAdapter(mMyFragmentPagerAdapter);

        mCircleIndicator = (CirclePageIndicator) findViewById(R.id.news_indicator);
        mCircleIndicator.setViewPager(mViewPager);
        mCircleIndicator.setOnPageChangeListener(new MyPagerListener());
    }

    public class MyPagerListener implements ViewPager.OnPageChangeListener
    {
        @Override
        public void onPageSelected(int position)
        {
            // TODO Grab the menu item and change it.
            invalidateOptionsMenu();
        }

        @Override
        public void onPageScrolled(int position, float positionOffset,
                int positionOffsetPixels)
        {

        }

        @Override
        public void onPageScrollStateChanged(int state)
        {
        }
    }

    private class MyFragmentPagerAdapter extends FragmentPagerAdapter
    {
        public MyFragmentPagerAdapter(FragmentManager fm)
        {
            super(fm);
        }

        @Override
        public Fragment getItem(int index)
        {
            return NewsViewFragment.newInstance(news.get(index),
                    getApplicationContext());
        }

        @Override
        public int getCount()
        {
            return news.size();
        }

        public int getItemPosition(Object obj)
        {
            return news.indexOf(obj);
        }
    }
}

Я устанавливаю новое намерение и вызываю все, что я обычно называю, так, как я думаю, это должно "просто работать" (ТМ).Тем не менее, это НЕ.

Итак, мой общий вопрос: как заставить это действие начать FRESH.

, и мой альтернативный вопрос: что я делаю, что по своей сути неправильно?

Я выражаю свои общие соболезнования и оправдания всему, что может восприниматься как "n00by"

Ответы [ 2 ]

1 голос
/ 19 февраля 2012

Если вам абсолютно необходимо перезапустить свою деятельность, переопределите onNewIntent (Intent).

Вызовите финиш, а затем создайте новое намерение для действия.

0 голосов
/ 04 февраля 2012

с помощью onResume (), выполнить finish (), а затем запустить намерение с той же самой деятельностью.

...