【问题标题】:android - method in fragment is not able to access variables declared earlierandroid - 片段中的方法无法访问之前声明的变量
【发布时间】:2017-09-15 11:45:35
【问题描述】:

我有一个片段:

public class VertretungsplanTab extends Fragment implements MainActivity.VertDataInterface{

    TextView vertretungsView;
    String LOG_TAG = VertretungsplanTab.class.getSimpleName();

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.vertretungsplan_fragment, container,false);
        vertretungsView = (TextView) rootView.findViewById(R.id.textView2);
        vertretungsView.setText("initialised");
        return rootView;
    }

    @Override
    public void onRefreshed(Fragment tab,String data){
        Log.v(LOG_TAG, "interface is working");
        if(vertretungsView!=null) {
            vertretungsView.setText(data);
        }
        else{
            Log.e(LOG_TAG, "TextView is null object");
        }
    }
}

MainActivity中的界面代码是这样的:

    public class MainActivity extends AppCompatActivity {

            VertDataInterface mdataInterface;
            private Fragment Vertretungstab;

            public interface VertDataInterface {
                public void onRefreshed(Fragment tab,String data);
            }
            private SectionsPagerAdapter mSectionsPagerAdapter;
            private ViewPager mViewPager;


            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);

                Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
                setSupportActionBar(toolbar);
                // Create the adapter that will return a fragment for each of the three
                // primary sections of the activity.
                mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

                // Set up the ViewPager with the sections adapter.
                mViewPager = (ViewPager) findViewById(R.id.container);
                mViewPager.setAdapter(mSectionsPagerAdapter);

                TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
                tabLayout.setupWithViewPager(mViewPager);

                Vertretungstab = mSectionsPagerAdapter.getItem(1);
                try {
                    mdataInterface = (VertDataInterface) Vertretungstab;
                } catch (ClassCastException e) {
                    Log.e(LOG_TAG, e + " fragment must implement VertDataInterface");
                }
            }

    @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            int id = item.getItemId();
            if (id == R.id.action_refresh) {
                mdataInterface.onRefreshed(Vertretungstab,"cool");
                return true;
            }
            return super.onOptionsItemSelected(item);
        }

        public class SectionsPagerAdapter extends FragmentPagerAdapter {

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

        @Override
        public Fragment getItem(int position) {
            switch (position) {
                case 0:
                    DashboardTab tabDashboard = new DashboardTab();
                    return tabDashboard;
                case 1:
                    VertretungsplanTab tabVertretungsplan = new VertretungsplanTab();
                    return tabVertretungsplan;
                default:
                    return null;
            }
        }

        @Override
        public int getCount() {
            // Show 2 total pages.
            return 2;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            switch (position) {
                case 0:
                    return "Dashboard";
                case 1:
                    return "Vertretungsplan";
            }
            return null;
        }
    }
}

我有一个问题: 为什么我无法在我的界面中访问我的 TextView。为什么我可以在 onCreate 方法中设置文本,为什么在接口方法中只获取空对象引用?!

在网上搜索了很长时间,如果有更高级的开发人员能找到解决方案,我会很高兴!

【问题讨论】:

  • 请提供您的接口代码
  • 这里看不到你的接口方法。我认为你做错了什么。
  • 尝试在 VertretungsplanTab 类中的 onRefreshed 方法之前添加 @Override 注解
  • 不幸的是,这没有任何区别
  • 您的textView2activity_main 中吗?而不是vertretungsplan_fragment

标签: android android-fragments interface textview nullreferenceexception


【解决方案1】:

方法:

public void onRefreshed(Fragment tab,String data);

MainActivity.java 中包含的内容与 VertretungsplanTab.java 中实现的内容不同。

在 VertretungsplanTab 你有:

public void onRefreshed(String data)

不应该是:

public void onRefreshed(Fragment tab, String data)

【讨论】:

  • 对不起,我只是有点乱。在我的实际代码中,此错误不存在。
  • 在 mdataInterface.onRefreshed(Vertretungstab,"cool") 中放一个断点;并检查哪个实例为空
  • 什么意思?!
  • 我的意思是可能在片段的 onCreate 运行之前调用 onRefresh ?
【解决方案2】:

好吧,我解决了我的问题... 我必须将 TextView 变量设置为 public static ...

public static TextView vertretungsView;

【讨论】:

    猜你喜欢
    • 2022-11-01
    • 1970-01-01
    • 2020-01-15
    • 2021-05-22
    • 1970-01-01
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    • 2017-11-29
    相关资源
    最近更新 更多