2016-08-25 5 views
0

FragmentSwitchが変更された場合、私はMainActivityクラスをチェックインしたいと思います。だから私は今Fragmentクラスとメインクラス(ActivityName)を持っています。フラグメントの代わりにMainActivityのSwitch.setOnCheckedChangeListener

私はすでにメインアクティビティクラスのフラグメントから参照を取得しようとしましたが、それはいつ呼び出すべきかわからないために機能しません(常にnull参照を示しています。これはonviewcreated hasn私がそれを試しても呼ばれていない)。

私のフラグメントにはSwitch.setOnCheckedChangeListenerを作成できますが、メインクラスには作成できません。 (このように見える)

public void onViewCreated(View view, Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 

     switchA = (Switch) getView().findViewById(R.id.switchA); 

     switchA.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       if(isChecked){ 

       } 
       else{ 

       } 
      } 
     }); 

私の活動のクラスに私の断片クラスのうち、その情報を取得するための最良の選択いただきましたので?

私はどんなアドバイス:)

任意の提案が理解されるであろうために感謝しています。

+1

あなたは活性との間のインターフェースを使用することができます断片。インターフェイスによって、フラグメントからアクティビティをコールバックすることができます。 –

答えて

2

アクティビティからフラグメントのビューには触れないでください。あなたの問題に対処する最善の方法は、例えば、フラグメントとアクティビティの間の相互作用を提供するために、特別なインタフェースを作成することです:

ChackedChangedCallback.java:フラグメントで

public interface CheckedChangeCallback() { 
    void onCheckedChanged(boolean isChecked); 
} 

:活動で

private CheckedChangeCallback callback = null; 

public void onAttach(final Activity activity) { 
    super.onAttach(activity); 
    if (activity instanceof CheckedChangeCallback) { 
     this.callback = (CheckedChangeCallback) activity; 
    } 
} 

public void onDetach() { 
    super.onDetach(); 
    callback = null; 
} 

public void onViewCreated(View view, Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 

     switchA = (Switch) getView().findViewById(R.id.switchA); 

     switchA.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       callback.onCheckedChange(isChecked); 
      } 
     }); 

public class YourActivity extends AppCompatActivity implements CheckedChangeCallback { 

    ... 

    @Override 
    public void onCheckedChange(boolean isChecked) { 
     // do stuff here 
    } 

} 
+0

うわー、それは速かった、ありがとう、それは働いています:) –

-1

Activity

Activity

activity = this; 

onCreate方法で

static ActivityName activity; 

今すぐあなたのActivity(メインクラス)にSwitch方法をhandellingするための方法を作成し、あなたのActivity

public static ActivityName getInstance() 
{ 
     return activity; 
} 

方法を作成

public void handleSwitch(boolean value) 
{ 
     if(value) 
     { 
      ..... 
     } 
     else 
     { 
      ...... 
     } 
} 

Fragment

public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 

    switchA = (Switch) getView().findViewById(R.id.switchA); 

    switchA.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 


      ActivityName.getInstance().handleSwitch(isChecked); 


      if(isChecked){ 

      } 
      else{ 

      } 
     } 
    }); 
+0

あなたは静的フィールド(メモリリーク)にアクティビティを決して格納するべきではありません。 – pawelo

+0

すごく感謝していましたが、私はインターフェイスソリューションを選択しました。とにかく素敵な一日を持っています。 –

+0

@paweloガイドのおかげで –

1

で高速なソリューションは、スイッチの点検状況を扱うメインで関数を作成することです。その後、フラグメント内で、その関数を呼び出して、getActivity()を使ってSwitchクリックを処理できます。functionNameを() ですから、例えばあなたのメインでなければなりません:

public void handleSwitchClick(boolean checked) { 
    if (checked) { 
     // do something 
    else { 
     // do something else 
    } 
} 

およびフラグメントで:あなたはフラグメントにアクセスすべきではないよう

public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 

    switchA = (Switch) getView().findViewById(R.id.switchA); 

    switchA.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       getActivity().handleSwitchClick(isChecked); 
     } 
    }); 

は、しかし、他の方法で回避を行ってはいけませんインスタンスをメインアクティビティから削除します。

あなたは常にメインのスイッチの状態を確認する必要がある場合は、あなたが持っているだろうので、それをチェックしたりていないかどうかを考慮するために、新しいメンバーを定義することができます。

private boolean switchChecked = false; 

public void handleSwitchClick(boolean checked) { 
    if (checked) { 
     switchChecked = true; 
     // do something 
    else { 
    switchChecked = false; 
     // do something else 
    } 
} 
+0

返信ありがとうございます。 、 良い一日を –

関連する問題