Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从片段调用MainActivity中的视图?_Java_Android_Android Fragments - Fatal编程技术网

Java 如何从片段调用MainActivity中的视图?

Java 如何从片段调用MainActivity中的视图?,java,android,android-fragments,Java,Android,Android Fragments,我有一个活动,比如说MyActivity,它有一个ViewPager,它设置一个FragmentStatePagerAdapter,它适应给定数量的片段。此外,我想在所有片段上添加一个CirclePageIndicator(杰克·沃顿的) 我的问题是:我的ViewPager在MyActivity.xml文件中,但我的CirclePageIndicator视图在fragment.xml文件中。 为了触发CirclePageIndicator我需要使用setViewPager方法,该方法需要一个Vi

我有一个活动,比如说
MyActivity
,它有一个
ViewPager
,它设置一个
FragmentStatePagerAdapter
,它适应给定数量的片段。此外,我想在所有片段上添加一个
CirclePageIndicator
(杰克·沃顿的)

我的问题是:我的
ViewPager
MyActivity.xml
文件中,但我的
CirclePageIndicator
视图在
fragment.xml
文件中。 为了触发
CirclePageIndicator
我需要使用
setViewPager
方法,该方法需要一个
ViewPager
对象作为参数,这意味着我需要在
MyActivity
类中触发
CirclePageIndicator
,在该类中初始化
ViewPager
obj

如何安全地调用
MyActivity
中的
CirclePageIndicator
,尽管它位于
fragment.xml
文件中

值得注意的是,我提出了一个类似的问题,他们建议像这样访问片段:

pageFragment = (PageFragment) getSupportFragmentManager().findFragmentById(R.id.fragId);
pageFragment.circleIndicator.setViewPager(viewPager);
--> Toolbar 
--> Viewpager 
--> CircleIndicator
但是我在尝试访问circleIndicator时仍然收到一个nullPointerException!!详情如下:

Caused by: java.lang.NullPointerException: Attempt to read from field 'com.viewpagerindicator.CirclePageIndicator com.example.ibm.shoppingequalizer.appintrolib.PageFragment.circleIndicator' on a null object reference
                                                                                   at com.example.ibm.shoppingequalizer.appintrolib.MyActivity.onCreate(MyActivity.java:32)
这是我的密码:

MyActivity.java

public class AppIntro extends FragmentActivity {

ViewPager viewPager;
PageFragment pageFragment;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_app_intro2);
    viewPager = (ViewPager) findViewById(R.id.viewPager);

    PageFragment.SwipeAdapter swipeAdapter = new PageFragment.SwipeAdapter(getSupportFragmentManager());
    viewPager.setAdapter(swipeAdapter);


    //In order to use CirclePageIndicator I need 
    //something like this ->  circleIndicator.setViewPager(viewPager);

 }
}  
my_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.ibm.shoppingequalizer.appintrolib.MyActivity">

<android.support.v4.view.ViewPager
    android:id="@+id/viewPager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

</RelativeLayout>
SwipeAdapter.java

public class PageFragment extends Fragment {

public static PageFragment newInstance(String title, String msg, int thumb) {
    PageFragment fragment = new PageFragment();

    Bundle args = new Bundle();
    args.putString("title", title);
    args.putString("msg", msg);
    args.putInt("thumb", thumb);
    fragment.setArguments(args);

    return fragment;
}

TextView message;
TextView title;
ImageView imageView;
CirclePageIndicator circleIndicator;

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

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

    String title1 = getArguments().getString("title");
    String msg = getArguments().getString("msg");


    message = (TextView) view.findViewById(R.id.msg);
    title = (TextView) view.findViewById(R.id.title);
    imageView = (ImageView) view.findViewById(R.id.imageView);
    circleIndicator = (CirclePageIndicator) view.findViewById(R.id.circleIndicator);

    setTextFonts();

    title.setText(title1);
    message.setText(msg);



    return view;
   }
}
static class SwipeAdapter extends FragmentStatePagerAdapter {

    List<IntroPageInfo> allInfo = getItem();

    public SwipeAdapter (FragmentManager fm){
        super(fm);
    }

    public List<IntroPageInfo> getItem() {
        List<IntroPageInfo> allInfo = new ArrayList<>();

        allInfo.add(new IntroPageInfo("A",
                "blalalala",
                R.drawable.grocery_shopping_with_the_holy_spirit));
        allInfo.add(new IntroPageInfo("B",
                "didndiddidind",
                R.drawable.category_intro));
        allInfo.add(new IntroPageInfo("C",
                "ciccicicicici",
                R.drawable.category_intro));
        allInfo.add(new IntroPageInfo("D",
                "ding dang dong",
                R.drawable.category_intro));
        allInfo.add(new IntroPageInfo("E",
                "ehmmmmmmmmmmmmmmm",
                R.drawable.category_intro));

        return allInfo;
    }


    @Override
    public Fragment getItem(int i) {
        IntroPageInfo info = allInfo.get(i);
        PageFragment fragment = new PageFragment().newInstance(info.title, info.message, info.image);
        return fragment;
    }

    @Override
    public int getCount() {
        return 5;
    }
}
static class IntroPageInfo {
    String title;
    String message;
    int image;

    public IntroPageInfo(String title, String message, int image) {
        this.title = title;
        this.message = message;
        this.image = image;
    }
}

如果要从片段调用活动视图

尝试在活动中实现此功能,以提供通过接口从此活动调用视图的方法

public class TestActivity implement GetTextCallback {
   public interface GetTextCallback {
       String getTextYouWant()
   }

   @Override
   public String getTextYouWant() {
       return editText.getText().toString();
   }
}
在这个片段中,通过您创建的接口从您的活动调用视图

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    if (getTextCallback == null) {
        getTextCallback = (GetTextCallback) activity;
    }
}

public void whenYouWantToGetText() {
    if (getTextCallback != null) {
        getTextCallback.getTextYouWant();
    } 
}

您应该在活动中放置
CirclePageIndicator

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_app_intro2);
    viewPager = (ViewPager) findViewById(R.id.viewPager);

    PageFragment.SwipeAdapter swipeAdapter = new PageFragment.SwipeAdapter(getSupportFragmentManager());
    viewPager.setAdapter(swipeAdapter);
    circleIndicator = (CirclePageIndicator) findViewById(R.id.circleIndicator);
    circleIndicator.setupWithViewPager(viewPager);


 }
也相应地修改xml文件
圆圈指示器
片段
移动到
活动
xml文件。
activity.xml
框架应该是这样的:

pageFragment = (PageFragment) getSupportFragmentManager().findFragmentById(R.id.fragId);
pageFragment.circleIndicator.setViewPager(viewPager);
--> Toolbar 
--> Viewpager 
--> CircleIndicator

修改xml文件是什么意思?到底是什么?圆圈指示器?我不能这样做。因为活动xml文件是一个viewPager?或者你的意思是什么?是的,这就是为什么你应该将
R.id.circleIndicator
从活动移动到活动。检查我的更新答案。但是我的Viewpager应该覆盖高度和宽度都匹配的孔屏幕!!因为圆圈指示器在碎片上!不低于!!您想在何处准确显示您的
圆圈指示器
?你能提供一些图片/草图吗?我不知道如何在stackoverflow上提供图片/草图。但我的意思很简单。该活动有一个设置片段的viewPage。在碎片底部的背景上,我想要一个圆形指示器。我放不下。因为我需要,所以在viewPager下面。碎片上的指示器!!!!:)可能重复的