2016-08-25 45 views
0

如果Fragment中的Switch已更改,我想檢查我的MainActivity類。所以現在我有一個Fragment類和一個主類(ActivityName)。MainActivity中的Switch.setOnCheckedChangeListener而不是片段

我已經試圖從我的主要活動類的片段獲取參考,但那不工作,因爲我不知道什麼時候該調用它(它說,總是空引用我想這是因爲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

你不應該觸碰活動中的Fragment觀點。解決您的問題,最好的方法是創建特殊的接口,提供片段和活動之間的互動,例如:

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

static ActivityName activity; 
Activity

activity = this; 

onCreate方法

現在,在您Activity

public static ActivityName getInstance() 
{ 
     return activity; 
} 

現在創建方法創建方法在Activity(主類)handelling Switch方法

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

哇真快,謝謝了很多,但我選擇了接口解決方案,anywayws有一個愉快的一天:) –

+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

感謝這麼快答覆,但我選擇界面中的「指南」作爲解決方案, 祝你今天愉快 –

相關問題