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

我不能在我的活动中调用我的片段方法,我想在两个不同的片段中调用两个方法?

陶成济
2023-03-14
public class MainActivity extends FragmentActivity {
    ViewPager viewpager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        viewpager = (ViewPager)findViewById(R.id.viewPager);
        MyFragmentAdapter adapter = new MyFragmentAdapter(getSupportFragmentManager());
        viewpager.setAdapter(adapter);
    }

    private class MyFragmentAdapter extends FragmentPagerAdapter{

        public MyFragmentAdapter(FragmentManager fm) {
            super(fm);
            // TODO Auto-generated constructor stub
        }

        @Override
        public Fragment getItem(int position) {
            // TODO Auto-generated method stub
            switch (position) {
            case 0:
                return new WeatherCurrentFragment();
            case 1:
                return new WeatherForeCastFragment();
            }
            return null;
        }

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return 2;
        }

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.weather, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        if(item.getItemId() == R.id.change_city){
            showInputDialog();
        }
        return super.onOptionsItemSelected(item);
    }

    private void showInputDialog(){
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("Change city");
        final EditText input = new EditText(this);
        input.setInputType(InputType.TYPE_CLASS_TEXT);
        builder.setView(input);
        builder.setPositiveButton("Go", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                changeCity(input.getText().toString());
            }
        });
        builder.show();
    }

    public void changeCity(String city){
         WeatherCurrentFragment cf = (WeatherCurrentFragment)getSupportFragmentManager().findFragmentById(R.id.currentweather);
         cf.updateWeatherData(city);
         WeatherForeCastFragment ff = (WeatherForeCastFragmen)getSupportFragmentManager().findFragmentById(R.id.forecast);
         ff.updateWeatherData(city);
         new CityPreference(this).setCity(city);
    }
}

并且显示错误

07-18 08:59:34.755: E/AndroidRuntime(2114): java.lang.NullPointerException: Attempt to invoke virtual method 'void example.giaodien1.WeatherCurrentFragment.updateWeatherData(java.lang.String)' on a null object reference

正如您所看到的,当我单击Button时,我想从CurrentWeatherFragment调用一个方法,从ForecastWeatherFragment调用一个方法。

共有1个答案

阎德宇
2023-03-14

代码如下:

getSupportFragmentManager().findFragmentById(R.id.currentweather);

返回空对象引用。

这个问题可能对您有帮助,findFragmentById返回null

public interface OnCityChangedListener(){
    public void onCityChanged(String city);
}
public MyFragment extends Fragment implements OnCityChangedListener
@override
public void onCityChanged(String city){
    updateWeatherData(city);
}
public MyFragmentAdapter(FragmentManager fm, ArrayList<Fragment> fs) {
    super(fm);
    this.fs = fs;
}
public void changeCity(String city){
    fs.onCityChanged(city);
}
 类似资料:
  • 我有一个包含一个活动和两个片段的应用程序,在第一个片段中,我应该能够将数据插入数据库,在第二个片段中,我应该能够在一个RecyclerView中看到添加的项目。 所以我已经创建了数据库、我的RecyclerView适配器和ViewModel, 我是否应该在活动中初始化ViewModel,并以某种方式从片段中调用它来使用insert? 我是否应该在两个片段中初始化viewmodel两次? 我的代码如

  • 我知道string1将包含一个空字符串。我的问题是为什么像下面这样两次调用nextLine方法会出现错误:

  • 知道TargetFragment现在已被弃用,如何从DialogFragment调用片段的方法? 过去,我可以这样做: 父级碎片 对话框碎片 这不再可能,因为目标碎片现已弃用。 我读到可以使用setFragmentResultListener()传递变量,但是如何从DialogFragment调用ParentFragment.myMethod()方法呢?

  • 我有一个片段,其中我有RecolyerView和使用RecolyerView适配器在这个RecolyerView中设置数据。 现在,我在适配器的列表项中有一个按钮,单击该按钮,我需要检查android中的READ_EXTERNAL_STORAGE权限,以获取android中的新权限模型。 我在这个适配器的片段中创建了一个新函数来检查权限是否被授予,如果还没有授予,则请求权限。 我已经使用下面的代码

  • 问题内容: 我想从fragmentA调用FragmentB(Class)的方法,我试图通过在fragmentA(class)中创建fragmentb的对象来尝试,但是在这里它不起作用是该类中fragmentA的代码,我有一个方法可以通过FragmentB类的方法 我想称这个为fragmentB的方法 我尝试通过fragmentA方法编写此代码,但出现错误 问题答案: 试试这个解决方案: