1

物事を簡単にするために、私のアプリはたくさんのカードで構成されています (Google スタイル)。設定で、ユーザーはメイン アクティビティで表示可能なカードを選択できます。私の問題は、ユーザーがどのカードを有効にするかを選択した後、メイン アクティビティを更新する方法がわからないことです。

うまくいけば、この図は私が言おうとしていることを説明しています。

main activity --> (menu button) --> settings (menu item) --> preference fragment (settings screen) --> (user selects which cards are enabled) --> (back button) --> (main activity should reflect the changes)

onResume メソッドを使用して調べ、その中で recreate() を呼び出しました。正しい方向に向かっているかどうかはわかりません。それを追加した後、アプリがクラッシュしました。

メイン アクティビティ.java

public void onCreate(Bundle savedInstanceState) {
        //remove title bar
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // init CardView
        mCardView = (CardUI) findViewById(R.id.cardsview);
        mCardView.setSwipeable(true);

        CardStack freqUsedGroup = new CardStack();
        freqUsedGroup.setTitle("Easy Access Cards");
        mCardView.addStack(freqUsedGroup);

        loadPref();
        //Begin UMass Website Card

        MyPlayCard umassEduCard = new MyPlayCard("UMass.edu",
                "Click this card to access UMass Amherst Website", "#881c1c",
                "#CC0000", true, true);
        umassEduCard.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setData(Uri.parse("http://www.umass.edu/"));
            startActivity(intent);

            }
            });
        //end UMass Website Card

           if(my_checkbox_preference == true)
        {
            mCardView.addCard(umassEduCard);
        }
    mCardView.refresh();
}

public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    Intent intent = new Intent();
    intent.setClass(MainActivity.this, SetPreferenceActivity.class);
    startActivityForResult(intent, 0); 

    return true;
 }


private void loadPref() {
      SharedPreferences mySharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);

      my_checkbox_preference = mySharedPreferences.getBoolean("umass_website", false);

     }

SettingsFragment.java

public class SettingsFragment extends PreferenceFragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Load the preferences from an XML resource
        addPreferencesFromResource(R.layout.preferences);
    }
}

ありがとうございます。xml などのコードがさらに必要な場合はお知らせください。

4

1 に答える 1

1

startActivityForResult メカニズムを使用する必要があります。

ここにいくつかの擬似コードがあります:

MainActivity -> startActivityForResult(Settings activity)
settingActivity.onCreate() -> setResult(RESULT_CANCELED)
if any settings is actually changed -> setResult(RESULT_OK)
mainActivity.onActivityResult -> if( RESULT_OK )
      // you can try to actually change stuff or, make it a pretty simpler.
      // just re-start the whole thing
      startActivity(new Intent(this, this.class));
      finish();

編集:

setResultフラグメントから、このようにメソッドを呼び出すことができます

// inside SettingsFragment 
// whenever something changed in the settings and you want to re-start the MainAcitivty
getActivity().setResult(RESULT_OK);
// simple!

まだ「アクティビティ結果」通信を行っている MainActivity と SetPreferenceActivity は、SettingsFragment によってショットを呼び出します ;)

于 2013-08-25T13:14:17.183 に答える