Android 在片段中更新ui

Android 在片段中更新ui,android,android-fragments,Android,Android Fragments,我似乎无法在我的一个片段中更新ui,我不知道为什么。我有一个主要活动,它应该向片段发送一些json,并使用json对象中的数据更新UI。我正在成功地发送json,我可以将数据记录在我发送过来的片段中。我只是无法更新UI中的文本框值 在我的主要活动中 MainPageFragment myFragment = new MainPageFragment(); SectionsPagerAdapter mSectionsPagerAdapter; ViewPager mView

我似乎无法在我的一个片段中更新ui,我不知道为什么。我有一个主要活动,它应该向片段发送一些json,并使用json对象中的数据更新UI。我正在成功地发送json,我可以将数据记录在我发送过来的片段中。我只是无法更新UI中的文本框值

在我的主要活动中

    MainPageFragment myFragment = new MainPageFragment();
    SectionsPagerAdapter mSectionsPagerAdapter;
    ViewPager mViewPager;

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        //Create adapter that will return a fragment for each section of app
        mSectionsPagerAdapter = new SectionsPagerAdapter(getFragmentManager());

        mViewPager = (ViewPager) findViewById(R.id.pager);
        mViewPager.setAdapter(mSectionsPagerAdapter);

    }

@Override
public void onSuccess(JSONObject user) {


    //This seems to be all I need
    myFragment.grabJSON(user);
}

public class SectionsPagerAdapter extends FragmentPagerAdapter {

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

        @Override
        public  int getCount() {
            return 2;
        }

        @Override
        public CharSequence getPageTitle (int position) {
            return titles[position];
        }

        @Override
        public Fragment getItem(int position) {
            if (position == 1) {

                return new PreferenceFragment() {
                    @Override
                    public void onCreate(Bundle savedInstanceState) {
                        super.onCreate(savedInstanceState);
                        addPreferencesFromResource(R.layout.settings_preferances);
                    }
                };
            }

            else {
                return myFragment;
            }
        }
    }
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.view.ViewPager
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity" >

        <android.support.v4.view.PagerTabStrip
            android:id="@+id/pager_header"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="top"
            android:textColor="#fff"/>
        <FrameLayout
        android:id="@+id/fragment_placeholder"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" ></FrameLayout>
</android.support.v4.view.ViewPager>
在我的MainFragment.java中

public void grabJSON(JSONObject object){
    getActivity().runOnUiThread(new Runnable() {
        @Override
        public void run() {
            TextView usernameTextView = (TextView) getView().findViewById(R.id.usernameview);
            CharSequence val = usernameTextView.getText();
            Log.d("value", val.toString());

            usernameTextView.setText("NEW TEXT");//Set the Text
            val = usernameTextView.getText();
            Log.d("value", val.toString());
        }
    });
}
它发送json的事实是不相关的,根据日志,我的文本框值正在改变,但实际的UI没有改变

我在这里为main活动添加xml

    MainPageFragment myFragment = new MainPageFragment();
    SectionsPagerAdapter mSectionsPagerAdapter;
    ViewPager mViewPager;

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        //Create adapter that will return a fragment for each section of app
        mSectionsPagerAdapter = new SectionsPagerAdapter(getFragmentManager());

        mViewPager = (ViewPager) findViewById(R.id.pager);
        mViewPager.setAdapter(mSectionsPagerAdapter);

    }

@Override
public void onSuccess(JSONObject user) {


    //This seems to be all I need
    myFragment.grabJSON(user);
}

public class SectionsPagerAdapter extends FragmentPagerAdapter {

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

        @Override
        public  int getCount() {
            return 2;
        }

        @Override
        public CharSequence getPageTitle (int position) {
            return titles[position];
        }

        @Override
        public Fragment getItem(int position) {
            if (position == 1) {

                return new PreferenceFragment() {
                    @Override
                    public void onCreate(Bundle savedInstanceState) {
                        super.onCreate(savedInstanceState);
                        addPreferencesFromResource(R.layout.settings_preferances);
                    }
                };
            }

            else {
                return myFragment;
            }
        }
    }
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.view.ViewPager
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity" >

        <android.support.v4.view.PagerTabStrip
            android:id="@+id/pager_header"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="top"
            android:textColor="#fff"/>
        <FrameLayout
        android:id="@+id/fragment_placeholder"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" ></FrameLayout>
</android.support.v4.view.ViewPager>


这已经用正确的代码进行了更新,结果证明我定义了两次片段

谢谢大家,,
汤姆

我猜你没有在活动中添加片段吧

FragmentManager fragmentManager = getFragmentManager()
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
MainPageFragment fragment = new MainPageFragment ();
fragmentTransaction.add(R.id.fragment_container, fragment);
fragmentTransaction.commit();

你的碎片被添加了两次


它是通过布局XML文件添加的,然后执行一个片段事务来添加它。通过布局添加片段的效果不如预期的好,因此您应该在占位符视图中添加片段,然后通过片段管理器添加片段。这应该会把一切都清理干净。

你能展示一下你在哪里添加/删除片段的代码吗?像3ST一样,如果您意外地添加了两次或两次片段,这样片段实例就会更新,而不是前台的实例,那么可能会出现问题。我用新代码更新了它。我似乎得到了一个npe。对不起,我是新手,我是否会将占位符视图放在mainactivity xml文件中,然后把碎片放在里面?@lostAstronaut是的,没错。在XML中,您使用适当的
layout
属性将其放入空视图或FrameLayout,然后使用其ID作为
FragmentTransaction.add(…)
调用的参数。我用我认为您所说的内容对其进行了更新,但现在似乎我调用了所有方法两次。。。它仍然在崩溃。我唯一的猜测是,一开始我没有正确设置片段和/或我的框架占位符不正确。哦,占位符是对的,我猜我是在类的顶部声明片段,然后在方法中再次声明片段。。。修复了它,感谢占位符帮助。我会用我的代码来更新它。