2017-05-02 17 views
0

私はアンドロイドが新しく、フラグメントを作成して使用しようとしています。アンドロイドはフラグメントからMainActivity関数を呼び出す

私は、選択する複数の日付の単純なリストを示し、onClickListenerを実装するフラグメントを持っています。このアイデアは、ユーザーが一度日付を選択すると、フラグメントがMainActivityに日付を戻し、MainActivityはデータベース内のクエリを実行し、別のフラグメントにデータベース応答を送信します。

私はMainActivityに日付を戻ってエレガントに送信することに固執しています。私は多くの情報を見つけることができません。私はこれを見つけた:

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

私はこれには非常に新しいですが、これは私にはハッキーです。これは正しい方法ですか、別の方法ですか?

入力が高く評価されています

答えて

2

私は非常にきれいなので、インタフェースベースのアプローチを推奨します。 Activityは、そのインターフェイスを実装するようにしてください

interface OnMyStuffListener { 
    void myMethod(); 
} 

:あなたのFragmentまたは外部のいずれかで、ネストされたインターフェースを宣言することができ

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

インスタンスを確認することができるようにFragmentActivityに添付されます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でありますまあまあ。あなたは、あなたのFragmentActivity

に添付されていることを確認していない場合にも、Interfaceを使用してLocalBroadcastManagerようEventBusを使用して、またはIntentで新しいActivityを開始することでこれを達成することができますし、flagのいくつかのフォームが渡され、これを使用することができますそのextrasバンドルなどにここ

インターフェイスを使用に関する例である:インターフェイス(EventListener)に

追加機能sendDataToActivity()。

//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); 
    } 
} 

ActivityMyFragmentattachでそれをリスナーを作成します。

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; 
    } 
} 

これは〜

関連する問題