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下面。碎片上的指示器!!!!:)可能重复的