该片段不是MainActivity的一部分,而是在Activities onCreate()方法中加载到活动的FrameLayout中。
主体活动
public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener,
FragmentContract{
Toolbar mToolbar;
DrawerLayout mDrawerLayout;
private FactFragment factFragment;
private RandomFragment randomFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
factFragment = new FactFragment();
//show FactFragment when app is opened
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
new FactFragment()).commit();
}//onCreate()
//overriden methods of FragmentContract
@Override
public void randomSwipe() {
}
@Override
public void leftToRight() {
if(factFragment != null){
Toast.makeText(this,"left to right in main",Toast.LENGTH_SHORT).show();
factFragment.updateFact("from main");
//factFragment.getActivity().findViewById(R.id.factFragTV);
}else {
Toast.makeText(this, "fragment is null", Toast.LENGTH_SHORT).show();
}
}
FactFragment
public class FactFragment extends Fragment {
//communicate between fragment and activity
private FragmentContract communicator;
private TextView fact;
public FactFragment(){}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
//assign listener variable (communicator) and check if
//MainActivity implements the interface
if(activity instanceof FragmentContract){
//assign listener variable
communicator = (FragmentContract) activity;
Log.d("tag", "listener assigned");
}else{
throw new RuntimeException(activity.toString() + "must implement FragmentContract");
}
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable final ViewGroup container, @Nullable Bundle savedInstanceState) {
// Inflate the layout for this fragment
//this method is used to instantiate the views
View rootView = inflater.inflate(R.layout.fragment_fact, container, false);
factBackground = (ImageView) rootView.findViewById(R.id.factImageFrag);
fact = (TextView) rootView.findViewById(R.id.factFragTV);
//listen for swipe gestures
final GestureDetector gesture = new GestureDetector(getActivity(),
new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onDown(MotionEvent e) {
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
final int SWIPE_MIN_DISTANCE = 120;
final int SWIPE_MAX_OFF_PATH = 250;
final int SWIPE_THRESHOLD_VELOCITY = 200;
try {
if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
return false;
if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
} else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
//Toast.makeText(getActivity(), "left To right", Toast.LENGTH_SHORT).show();
communicator.leftToRight();
}
} catch (Exception e) {
// nothing
}
return super.onFling(e1, e2, velocityX, velocityY);
}
});
rootView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return gesture.onTouchEvent(event);
}
});
return rootView;
}//onCreateView()
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
fact = (TextView) getActivity().findViewById(R.id.factFragTV);
}
public void updateFact(String newFact){
fact.setText(newFact);
Toast.makeText(getActivity(), "updateFact called in fragment", Toast.LENGTH_SHORT).show();
Log.d("tag","Update()" + newFact);
}
@Override
public void onDetach() {
super.onDetach();
communicator = null;
}
}//FactFragment
接口
public interface FragmentContract {
void randomSwipe();
void leftToRight();//-->
}
你在这里犯了错误
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
new FactFragment()).commit();
应该在replace
中使用FactFragment
而不是new FactFragment()
。
下面是使用fragmentManager的更新代码,您可以使用它来修复此问题。
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
factFragment).commit();
问题内容: 类: 类: XML布局: 我试图访问内部的这样的: 我不断收到。我查看了所有文章以了解如何访问,但是没有一篇文章对我有帮助。 有人可以让我知道我在做什么错以及如何解决吗? 我还计划在我的内部添加其他我将来需要访问的。 问题答案: 由于尚未在以下代码段中初始化: 合理抛出。
当我从listview中添加或删除一个项目时,listview不会更新,除非我在viewpager中滚动到屏幕外,然后返回,在片段中再次触发OnCreate方法。这是基于eclipse中的viewpager模板的,我只是在片段中添加了一个listview,而不仅仅是一个textview。将notifyDataSetChanged放置到片段中没有帮助,也没有向片段中添加OnResume。以下是主要活
我正在考虑一个简单的例子,包括以下部分: Main活动:有编辑文本、按钮、viewPager 碎片A:什么都没有 碎片B:有文本视图 所以,在屏幕上,你可以滑动查看每个片段。我希望我的例子有这样一个功能:如果一个人在editText中写了一个文本,然后点击按钮,它就会出现在片段B中。 A使用notifyDatsetChanged()尝试了它,但不起作用。有人能帮忙吗?下面是我的全部代码: 主要活动
layout-widget.xml: background.xml: 来自DbAdapter.java的getTextViewData(): 有人知道我的代码中缺少了什么吗?
我真正想要的是一个功能,当我在Edittext上单击OK时,文本将在文本视图上写入 以下是错误。E/AndroidRuntime:致命异常:主进程:YouTube.Demo.YouTubeDemo,PID:2736 java.lang.NullPoInterException:尝试在YouTube.Demo.YouTubeDemo.Fragments.calculator_List.Calcula
问题内容: 确实需要一些建议,不知道这里出了什么问题。 上下文:2个片段,每个片段都有一个Textview,主要活动有2个按钮和一个edittext 目的:在主活动的edittext框中键入hello,然后单击片段1的按钮,textview将变为hello。 问题: 在edittext中输入hello并单击按钮1时,会遇到运行时错误。 Logcat: fragment_one.xml activi