gpt4 book ai didi

android - 如何从 Activity 中调用 Infinite ViewPager fragment 的方法

转载 作者:行者123 更新时间:2023-11-29 01:11:22 24 4
gpt4 key购买 nike

我正在尝试调用我的 fragment 的一些方法,但问题是我使用的是 Infinite ViewPager 而不是普通的 ViewPager。我尝试了以下方式来调用 fragment 方法。

  1. 我无法设置 ID,因为它在 Infinite ViewPager fragment 中。
  2. 我无法在 java 中使用 fragment 标记。
  3. 我尝试了 getItem 方法,但它导致崩溃。错误

FATAL EXCEPTION: main Process: beatbox.neelay.dialogtest2, PID: 28997 java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.SharedPreferences android.content.Context.getSharedPreferences(java.lang.String, int)' on a null object reference at beatbox.neelay.dialogtest2.Songdata.getPlayList(Songdata.java:26) at beatbox.neelay.dialogtest2.Songs.dataretrive(Songs.java:56) at beatbox.neelay.dialogtest2.MainActivity.onFragmentInteraction(MainActivity.java:134) at beatbox.neelay.dialogtest2.BlankFragment.onButtonPressed(BlankFragment.java:70) at beatbox.neelay.dialogtest2.BlankFragment$2.onClick(BlankFragment.java:60) at android.view.View.performClick(View.java:5207) at android.view.View$PerformClick.run(View.java:21177) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5441) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:738) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:628)

InfiniteViewPager 中的另一个问题是,如果用户继续像螺旋一样滑动,位置就不一样了。这就是我调用 InfiniteViewPager 的方式

private InfiniteViewPager pager = null;
private MyAdapter adapter;
private InfinitePagerAdapter myAdapter;

pager = (InfiniteViewPager) findViewById(R.id.pager);
FragmentManager fragmentManager = getSupportFragmentManager();


adapter = new MyAdapter(fragmentManager);
myAdapter = new InfinitePagerAdapter(adapter);
pager.setAdapter(myAdapter);

我试过用这种方式调用方法

   int pos = pager.getCurrentItem();
Fragment activeFragment = adapter.getItem(pos);
if(pos == 2){
((Songs)activeFragment).dataretrive();
((Songs)activeFragment).dataset();

}

任何有关如何调用该方法的提示都会有所帮助。

最佳答案

通常,从 Activity 中直接调用 fragment 的方法是不好的做法。

我建议您使用通知/监听器机制来执行此操作。像这样的东西:

public interface SomeEventListener {
void onEvent();
}

public interface SomeEventNotifier {
void addListener(SomeEventListener listener);

void removeListener(SomeEventListener listener);
}

public class ExampleActivity extends Activity implements SomeEventNotifier {
private final List<SomeEventListener> listeners = new CopyOnWriteArrayList<>();

@Override
public void addListener(SomeEventListener listener) {
listeners.add(listener);
}

@Override
public void removeListener(SomeEventListener listener) {
listeners.remove(listener);
}

private void notifySomeEvent() {
for (SomeEventListener listener : listeners) {
listener.onEvent();
}
}
}

public class ExamplpeFragment extends Fragment implements SomeEventListener {
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (isIntresterInSomeEvent()) {
SomeEventNotifier notifier = (SomeEventNotifier) getActivity();
notifier.addListener(this);
}
}

@Override
public void onDetach() {
super.onDetach();
if (isIntresterInSomeEvent()) {
SomeEventNotifier notifier = (SomeEventNotifier) getActivity();
notifier.removeListener(this);
}
}

private boolean isIntresterInSomeEvent() {
//here you have to add you logic to determinate rather the instance of fragment need notification about the event
return true;
}

@Override
public void onEvent() {
//here you will get call when activity notifySomeEvent is called.
}
}

notifySomeEvent 被调用时,所有附加的 fragment 都会被通知。

关于android - 如何从 Activity 中调用 Infinite ViewPager fragment 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42738106/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com