【问题标题】:How to call a method of a InfiniteViewPager fragment from activity如何从活动中调用 Infinite ViewPager 片段的方法
【发布时间】:2017-03-11 17:05:51
【问题描述】:

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

  1. 我无法在 Infinite ViewPager 片段中设置 id。
  2. 我无法在 java 中使用片段标签。
  3. 我尝试了 getItem 方法,但它导致崩溃.error

致命异常:主要 进程:beatbox.neelay.dialogtest2,PID:28997 java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法 'android.content.SharedPreferences android.content.Context.getSharedPreferences(java.lang.String, int)' 在beatbox.neelay.dialogtest2.Songdata.getPlayList(Songdata.java:26) 在beatbox.neelay.dialogtest2.Songs.dataretrive(Songs.java:56) 在beatbox.neelay.dialogtest2.MainActivity.onFragmentInteraction(MainActivity.java:134) 在beatbox.neelay.dialogtest2.BlankFragment.onButtonPressed(BlankFragment.java:70) 在beatbox.neelay.dialogtest2.BlankFragment$2.onClick(BlankFragment.java:60) 在 android.view.View.performClick(View.java:5207) 在 android.view.View$PerformClick.run(View.java:21177) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5441) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:738) 在 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();

    }

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

【问题讨论】:

  • 您的 sharedPreference 为空。

标签: android android-fragments android-viewpager


【解决方案1】:

通常,直接从活动中调用片段的方法是不好的做法。

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

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被调用时,所有附加的片段都会被通知。

【讨论】:

  • 所以我必须把方法放在我想调用的 onEvent 中
  • 以及如何从 addlisetner 的活动中调用方法?方法
  • 是的,您可以在 onEvent 方法中调用任何需要的方法。我不确定我是否理解第二个问题:addListener 应该在您的活动中实现,它应该只是将侦听器添加到所有侦听器的列表中。
  • 哦,对不起,我没有读到你最后一行我必须使用 notifySomeEvent 让我试试,我会让你知道 thx
  • thx 伙计,我被困住了,因为这要完成我的应用程序,因为你
猜你喜欢
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-20
  • 2012-09-21
  • 1970-01-01
相关资源
最近更新 更多