フラグメントから私のアクティビティのメソッドを呼び出そうとしています。フラグメントがメソッドデータを提供し、メソッドが戻るときにデータを取得する必要があります。静的メソッドの呼び出しと同様に達成したいのですが、アクティビティで問題が発生するため、静的メソッドを使用しません。
フラグメントが初めてなので、簡単で教育的な説明が必要です。
ありがとう!
フラグメントから私のアクティビティのメソッドを呼び出そうとしています。フラグメントがメソッドデータを提供し、メソッドが戻るときにデータを取得する必要があります。静的メソッドの呼び出しと同様に達成したいのですが、アクティビティで問題が発生するため、静的メソッドを使用しません。
フラグメントが初めてなので、簡単で教育的な説明が必要です。
ありがとう!
回答:
フラグメントからアクティビティへ:
((YourActivityClassName)getActivity()).yourPublicMethod();
アクティビティからフラグメントへ:
FragmentManager fm = getSupportFragmentManager();
//if you added fragment via layout xml
YourFragmentClass fragment = (YourFragmentClass)fm.findFragmentById(R.id.your_fragment_id);
fragment.yourPublicMethod();
コードを使用しtag
てフラグメントを追加し、フラグメントを追加するときに文字列を使用した場合は、findFragmentByTag
代わりに次を使用します。
YourFragmentClass fragment = (YourFragmentClass)fm.findFragmentByTag("yourTag");
別の場所で使用する場合は、フラグメントをアクティビティから分離することをお勧めします。これを行うには、アクティビティが実装するインターフェースを作成します。
したがって、次のようなインターフェースを定義します。
たとえば、アクティビティに文字列を指定して、整数を返すようにしたいとします。
public interface MyStringListener{
public Integer computeSomething(String myString);
}
これは、フラグメントまたは個別のファイルで定義できます。
次に、アクティビティにインターフェースを実装させます。
public class MyActivity extends FragmentActivity implements MyStringListener{
@Override
public Integer computeSomething(String myString){
/** Do something with the string and return your Integer instead of 0 **/
return 0;
}
}
次に、フラグメントにMyStringListener変数を設定し、リスナーをフラグメントのonAttach(Activityアクティビティ)メソッドに設定します。
public class MyFragment {
private MyStringListener listener;
@Override
public void onAttach(Context context) {
super.onAttach(context);
try {
listener = (MyStringListener) context;
} catch (ClassCastException castException) {
/** The activity does not implement the listener. */
}
}
}
編集(17.12.2015):onAttach(Activity activity) is deprecated, use onAttach(Context context) instead, it works as intended
最初の答えは間違いなく機能しますが、現在のフラグメントをホストアクティビティと結び付けます。別のアクティビティで使用する場合に備えて、フラグメントをホストアクティビティから切り離しておくことをお勧めします。
Kotlinの開発者
(activity as YourActivityClassName).methodName()
用のJava開発者
((YourActivityClassName) getActivity()).methodName();
フラグメントがどのように機能するかを理解した後で更新します。各フラグメントは親アクティビティに属しています。だからちょうど使用:
getActivity().whatever
フラグメント内から。余計なキャストを避けるため、これはより良い答えです。この解決策でキャストを回避できない場合は、以下の解決策を使用してください。
============
あなたがしなければならないことは、外側のアクティビティにキャストすることです
((MainActivity) getActivity()).Method();
新しいインスタンスを作成すると、Androidフレームが混乱し、認識できなくなります。また見なさい:
フラグメントを介してアクティビティで宣言された関数にアクセスするには、marcoの回答に示されているインターフェースを使用してください。
アクティビティを介してフラグメントで宣言された関数にアクセスするには、タグまたはIDがない場合にこれを使用できます
private void setupViewPager(ViewPager viewPager) {
//fragmentOne,fragmentTwo and fragmentThree are all global variables
fragmentOne= new FragmentOne();
fragmentTwo= new FragmentTwo();
fragmentThree = new FragmentThree();
viewPagerAdapteradapter = new ViewPagerAdapter(getSupportFragmentManager());
viewPagerAdapteradapter.addFragment(fragmentOne, "Frag1");
viewPagerAdapteradapter.addFragment(fragmentTwo, "Frag2");
viewPagerAdapteradapter.addFragment(fragmentThree, "Frag3");
//viewPager has to be instantiated when you create the activity:
//ViewPager viewPager = (ViewPager)findViewById(R.id.pager);
//setupViewPager(viewPager);
//Where R.id.pager is the id of the viewPager defined in your activity's xml page.
viewPager.setAdapter(viewPagerAdapteradapter);
//frag1 and frag2 are also global variables
frag1 = (FragmentOne)viewPagerAdapteradapter.mFragmentList.get(0);
frag2 = (FragmentTwo)viewPagerAdapteradapter.mFragmentList.get(1);;
//You can use the variable fragmentOne or frag1 to access functions declared in FragmentOne
}
これはViewpagerAdapterClassです
class ViewPagerAdapter extends FragmentPagerAdapter {
public final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();
public ViewPagerAdapter(FragmentManager manager) {
super(manager);
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
public void addFragment(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitleList.get(position);
}
}
この答えは私のような初心者向けです。良い一日を過ごしてください。
((KidsStoryDashboard)getActivity()).values(title_txt,bannerImgUrl);
public void values(String title_txts, String bannerImgUrl) {
if (!title_txts.isEmpty()) {
//Do something to set text
}
imageLoader.displayImage(bannerImgUrl, htab_header_image, doption);
}
私はこのスレッドに示されているすべてのメソッドを試しましたが、どれもうまくいきませんでした。これを試してください。それは私のために働いた。
((MainActivity) getContext().getApplicationContext()).Method();
((YourActivityName)getActivity()).functionName();
例: ((SessionActivity)getActivity()).changeFragment();
注:クラス名は公開する必要があります
コトリンのためにそれを試してみてください
class DataForm : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
Tasks(this).getData()
}
fun getResponse(response: String) {
// code
}
}
class Tasks(private val context: Any) {
fun getData() {
val getContext = (context as DataForm).activity
val getFragment = (context as DataForm)
val responseListener = Response.Listener<String> { response ->
getFragment.getResponse(response)
}
val errorListener = Response.ErrorListener { error ->
error.printStackTrace();
}
val stringRequest = StringRequest(Request.Method.GET, url, responseListener, errorListener)
Volley.newRequestQueue(getContext).add(stringRequest)
}
}