1

私は、Android互換ライブラリを使用して、minSDKが8(Android 2.2)およびtargetSDKが16(Android 4.1)のActionBarSherlockおよびViewPagerIndicatorで構築されたAndroidアプリケーションに取り組んでいます。メッセージがSQLiteデータベースに保存されるアプリのメッセージング部分があり、CommonsWareのcwac-loaderexを使用してSQLiteデータベースでカーソルローダーを使用しています。アクティビティが読み込まれると、すべてが正常に機能し、メッセージが表示されますが、デバイスを回転すると、読み込み中のcicleを含むListFragmentが表示されます。

LoaderManager.enableDebugLogging(true)をオンにすると、回転時に既存のローダーが再利用されます。onDestroyでgetSupportLoaderManager()。destroyLoader(ID)も試しましたが、新しいローダーが作成されていますが、同じ結果が得られます。 。メッセージングアクティビティを開く前に両方の方向でテストしましたが、どちらも正常に機能します。メッセージングアクティビティが表示されているときに回転すると問題になります。また、縦向きでメッセージングアクティビティにアクセスし、メッセージングアクティビティを破棄せずに別のアクティビティに移動するメッセージをクリックし、横向きに変更してからメッセージングアクティビティに戻ると、すべてが正常に表示されます。

ローテーション後にメッセージが表示されない理由を理解できませんでした。私はどんなアイデアや助けにもとても素晴らしいと思います。以下に私のメッセージ活動を含めました。

import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.ListFragment;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.Loader;
import android.support.v4.view.ViewPager;
import android.support.v4.widget.SimpleCursorAdapter;

import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
import com.commonsware.cwac.loaderex.acl.SQLiteCursorLoader;
import com.viewpagerindicator.TitlePageIndicator;

import com.lukekorth.DB.DatabaseHelper;
import com.lukekorth.Helpers.MessageFragment;

public class MyMessagesActivity extends SherlockFragmentActivity implements
LoaderManager.LoaderCallbacks<Cursor> {

        private FragmentAdapter mFragmentAdapter;
    private ViewPager mPager;
    private DatabaseHelper mDB;
    private SimpleCursorAdapter mInboxCursorAdapter;
    private SimpleCursorAdapter mArchiveCursorAdapter;

    private MessageFragment[] content = new MessageFragment[2];

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.messages);

        getSupportActionBar().setHomeButtonEnabled(true);
        getSherlock().getActionBar().setDisplayHomeAsUpEnabled(true);

        mDB = new DatabaseHelper(this);

        content[0] = new MessageFragment();
        content[1] = new MessageFragment();

        /////////--------------------///////
        LoaderManager.enableDebugLogging(true);

        mInboxCursorAdapter = new SimpleCursorAdapter(this, R.layout.message_item, null, new String[] { DatabaseHelper.senderName,
                DatabaseHelper.lastUpdate, DatabaseHelper.subject, DatabaseHelper.lastSnippet }, new int[] { R.id.name, R.id.date,
                R.id.subject, R.id.snippet });

        mArchiveCursorAdapter = new SimpleCursorAdapter(this, R.layout.message_item, null, new String[] { DatabaseHelper.senderName,
                DatabaseHelper.lastUpdate, DatabaseHelper.subject, DatabaseHelper.lastSnippet }, new int[] { R.id.name, R.id.date,
                R.id.subject, R.id.snippet });

        content[0].setListAdapter(mInboxCursorAdapter);
        content[1].setListAdapter(mArchiveCursorAdapter);

        getSupportLoaderManager().initLoader(0, null, this);
        getSupportLoaderManager().initLoader(1, null, this);
        ///////////////------------------////////////

        mFragmentAdapter = new FragmentAdapter(getSupportFragmentManager());
        mFragmentAdapter.updateContent(content);

        mPager = (ViewPager) findViewById(R.id.pager);
        mPager.setAdapter(mFragmentAdapter);

        TitlePageIndicator indicator = (TitlePageIndicator) findViewById(R.id.indicator);
        indicator.setViewPager(mPager);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        getSupportLoaderManager().destroyLoader(0);
        getSupportLoaderManager().destroyLoader(1);

        mDB.close();
    }

    @Override
    public Loader<Cursor> onCreateLoader(int folder, Bundle arg1) {
        String query = "select " + DatabaseHelper.threads + "." + DatabaseHelper.threadKey + "," + DatabaseHelper.subject +
                "," + DatabaseHelper.archive + "," + DatabaseHelper.otherUser + "," + DatabaseHelper.lastUpdate + "," +
                DatabaseHelper.lastSnippet + "," + DatabaseHelper.senderPicture + "," + DatabaseHelper.senderName + " from " +
                DatabaseHelper.threads + " left join " + DatabaseHelper.senders + " on " + DatabaseHelper.threads + "." +
                DatabaseHelper.otherUser + " = " + DatabaseHelper.senders + "." + DatabaseHelper.senderKey + " where " +
                DatabaseHelper.archive;

        if(folder == 0)
            query += " = 0 order by ";
        else
            query += " = 1 order by ";

        query += DatabaseHelper.lastUpdate + " desc";

        return new SQLiteCursorLoader(this, mDB, query, null);
    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
        if(loader.getId() == 0)
            mInboxCursorAdapter.swapCursor(cursor);
        else
            mArchiveCursorAdapter.swapCursor(cursor);
    }

    @Override
    public void onLoaderReset(Loader<Cursor> loader) {
        if(loader.getId() == 0)
            mInboxCursorAdapter.swapCursor(null);
        else
            mArchiveCursorAdapter.swapCursor(null);
    }
}

class FragmentAdapter extends FragmentPagerAdapter {
    protected static final String[] TITLE = new String[] { "Inbox", "Archive", };

    private ListFragment[] mContent;

    private int mCount = TITLE.length;

    public FragmentAdapter(FragmentManager fm) {
        super(fm);
    }

    public void updateContent(MessageFragment[] content){
        mContent = content;
    }

    @Override
    public Fragment getItem(int position) {
        return mContent[position % mContent.length];
    }

    @Override
    public int getCount() {
        return mCount;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return FragmentAdapter.TITLE[position % TITLE.length];
    }
}
4

1 に答える 1

1

ViewPagerとフラグメントタグに奇妙な点があることがわかりました。私の解決策は、トランザクションにフラグメントを追加してからonSaveInstanceState()onCreate()2番目のコード)に追加し、ViewPagerで生成されたタグを使用してタグごとにフラグメントを取得することでした。この質問から、使用されているタグスキームを理解することができました。これにより、誰かが数日間の作業を節約できることを願っています。

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();

    ft.add(content[0], content[0].getTag());
    ft.add(content[1], content[1].getTag());

    ft.commit();
}




    FragmentManager fm = getSupportFragmentManager();

    content[0] = (MessageFragment) fm.findFragmentByTag("android:switcher:"+ R.id.pager + ":0");
    content[1] = (MessageFragment) fm.findFragmentByTag("android:switcher:"+ R.id.pager + ":1");

    if(content[0] == null || content[1] == null){
        content[0] = new MessageFragment();
        content[1] = new MessageFragment();

        content[0].setListAdapter(mInboxCursorAdapter);
        content[1].setListAdapter(mArchiveCursorAdapter);
    }
于 2012-07-31T14:47:28.597 に答える