2011-10-17 10 views
14

2つのフラグメントを持つ単純なアプリケーションがあり、横向きモードでは、両方のフラグメントが縦に並べて表示されます。フラグメントAを表示してからオプションを選択すると、私の問題は、ポートレートモードでフラグメントBを表示しているときです。ユーザーがメニューオプションを選択した場合、フラグメントBに関連付けられているビューをリフレッシュまたは再描画し、この作業を行う方法を理解できません。私はgetViewメソッドとgetLayoutInflaterメソッドを試しましたが、私は新しいビューを作成していると思うので、画面は変わりません。私はまた、フラグメントAを参照しようとしましたが、新しいフラグメントを作成し、フラグメントBを置き換えるルーチンを呼び出すことはできますが、表示されていないため、参照を取得できません。私が本当に必要とするのは、新しいビューを拡大するためにonCreateViewメソッドを再度呼び出すだけですが、これを実行しようとするいくつかのメソッドを試しましたが、再度呼び出されるonCreateViewを取得できません。どのようにこれについての任意の考えですか?Android force再構築するフラグメントView

答えて

1

ユーザーは、私がリフレッシュまたはフラグメントBに関連付けられており、この作品onOptionsItemSelected()

を作成する方法を理解することはできませんビューを再描画したいメニューオプションを選択した場合は、アクティビティの呼び出しを持っていますフラグメント上のメソッドで、ウィジェットに新しいコンテンツを更新させるメソッド。または、フラグメントを置換するためにアクティビティにFragmentTransactionを実行させます(フラグメントがもともとFragmentTransactionで設定されていた場合)。あなたはFragmentTransactionを行い、これを行うにはあまりにも難しいことではありませんが、答えはあなたのメニューが置かれている場所に依存しますreplace()方法

を使用したいと思うでしょう

9

(すなわち、バックあなたの中にあなたonOptionsItemSelected()呼び出しです親アクティビティ、またはフラグメントA/Bのいずれかにありますか?)。

簡略化のために、メニュー実装でonOptionsItemSelected()が親アクティビティにあり、menu_option1が選択された場合にフラグメントの形を変えたいとします。あなたのメニューは(それがより多くの再利用可能なコードのためでなければなりません)あなたのフラグメントの1の子であるならば、一つの方法は、そのホストの活動を必要とすることで、

また
@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
// Handle item selection 
//... 
switch (item.getItemId()) { 
case R.id.menu_option1: 
    //do something 
    FragmentManager fragmentManager = getFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    Fragment newFragment = new YourFragmentClass(); 
    FragmentTransaction transaction = getFragmentManager().beginTransaction(); 
    transaction.replace(R.id.your_fragment_id, newFragment); 
    transaction.addToBackStack(null); 
    transaction.commit(); 
    return true; 
case R.id.menu_option2: 
    //do something else; 
    return true; 
default: 
    return super.onOptionsItemSelected(item); 
} 
} 

:それはこのようになりますFragmentで定義されたインタフェースを実装し、コールバックとして使用することができます。 フラグメントクラス内のonOptionsItemSelected()コールバックでは、このコールバックメソッドを呼び出すだけです。

一口のように聞こえますが、実際には2つのことを行う必要があります。あなたがR.id.your_fragment_idを交換するとき、あなたはそれがXMLで宣言されたことを想定している

public class MainActivity extends Activity implements FragmentA.onSelectedListener{ 
... 
public void onSelected(){ 
    FragmentManager fragmentManager = getFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    Fragment newFragment = new YourFragmentClass(); 
    FragmentTransaction transaction = getFragmentManager().beginTransaction(); 
    transaction.replace(R.id.your_fragment_id, newFragment); 
    transaction.addToBackStack(null); 
    transaction.commit(); 
} 
} 
+7

:これはあなたのフラグメントのクラスが

public static class FragmentA extends ListFragment { OnSelectedListener mListener; // Container Activity must implement this interface public interface OnSelectedListener { public void onSelected(); } ... @Override public void onAttach(Activity activity) { super.onAttach(activity); //This is to ensure that the Activity has implemented the interface we set up above try { mListener = (OnSelectedListener) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement OnSelectedListener"); } } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle item selection //... switch (item.getItemId()) { case R.id.menu_option1: //do something getActivity().onSelected(); return true; case R.id.menu_option2: //do something else; return true; default: return super.onOptionsItemSelected(item); } } ... } 

ですが、その後の活動では、あなたのようなものを見ることになることをふり。しかし、私のオリジナルの断片がプログラムで構築されていたらどうでしょうか? –

+1

@IgorGanapolskyこれは、そのフラグメントのコンテナのIDです – dmSherazi

関連する問題