当前位置: 首页 > 知识库问答 >
问题:

片段中的TextView将不会更新

芮化
2023-03-14

该片段不是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();//-->
}

共有1个答案

松增
2023-03-14

你在这里犯了错误

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