2017-05-02 37 views
0

我是新來的android和我試圖得到一個創造和使用片段的掛。android從一個片段調用MainActivity函數

我有一個片段,顯示了多個日期的簡單列表以供選擇並實現onClickListener。這個想法是一旦用戶選擇一個日期,片段將該日期發送回MainActivity,然後MainActivity在數據庫中運行查詢並將數據庫響應發送到另一個片段。

我被困在發回日期回到MainActivity,優雅點。我找不到很多信息。我發現這個:

Activity activity = getActivity(); 
if(activity instanceof MyActivity){ 
     MyActivity myactivity = (MyActivity) activity; 
     myactivity.myMethod(); 
} 

我對此很新,但這對我來說似乎很難受。這是正確的方式,還是有另一種方式?

任何輸入讚賞

回答

2

我更喜歡基於接口的方法,因爲很乾淨。您可以在Fragment或外接一個聲明嵌套接口:

interface OnMyStuffListener { 
    void myMethod(); 
} 

充分利用Activity,以實現該接口:

public class MainActivity extends Activity implements OnMyStuffListener { 
    @Override 
    public void myMethod() { 
     // Do whatever you want. 
    } 
} 

Fragment將被連接到Activity這樣你就可以檢查實例在Context,並把它轉換爲Activity

public class MyFragment extends Fragment implements View.OnClickListener { 
    private OnMyStuffListener mListener; 

    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 
     if (context instanceof OnMyStuffListener) { 
      mListener = (OnMyStuffListener) context; 
     } else { 
      throw new IllegalArgumentException("The context " + context.getClass().getName() + 
        "must implement " + OnMyStuffListener.class.getName()); 
     } 
    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 
     // Release it avoiding memory leak. 
     mListener = null; 
    } 


    @Override 
    public void onClick(View v) { 
     mListener.myMethod(); 
    } 
} 
+0

有趣....看起來清爽多了...我會試試這個,看看我能不能把它運行起來.. – Arn

1

YES,這是ABS正確的。您可以通過使用Interface,使用EventBusLocalBroadcastManager,或者開始一個新的ActivityIntent和某種形式的flag通過使用這個,如果你不知道你的Fragment連接到Activity

你也可以做到這一點到其extras捆綁或其他東西。

下面是關於使用接口的例子:

1. Add函數sendDataToActivity()插入到接口(EventListener)。

//EventListener.java 

public interface EventListener { 

    public void sendDataToActivity(String data); 
} 

2.MainActivity實現此功能。

// MainActivity.java 

public class MainActivity extends AppCompatActivity implements EventListener { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 

    @Override 
    public void sendDataToActivity(String data) { 
     Log.i("MainActivity", "sendDataToActivity: " + data); 
    } 
} 

MyFragmentattachActivity創建監聽。

4.最後,使用listener.sendDataToActivity("Hello World!")調用函數。

// MyFragment.java 

public class MyFragment extends Fragment { 

    private EventListener listener; 

    @Override 
    public void onAttach(Activity activity) 
    { 
     super.onAttach(activity); 
     if(activity instanceof EventListener) { 
      listener = (EventListener)activity; 
     } else { 
      // Throw an error! 
     } 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     View view = inflater.inflate(R.layout.fragment_my, container, false); 

     // Send data 
     listener.sendDataToActivity("Hello World!"); 

     return view; 
    } 

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

     listener = null; 
    } 
} 

希望這將有助於〜

相關問題