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调用一个方法。
代码如下:
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方法编写此代码,但出现错误 问题答案: 试试这个解决方案: