从适配器 class 调用方法时出错。 java.lang.IllegalStateException: 系统服务在 onCreate() 之前对 Activity 不可用
Getting Error while call a method from adapter class. java.lang.IllegalStateException: System services not available to Activities before onCreate()
当我尝试从我的适配器 class 调用一个方法时,我收到一个错误系统服务在 onCreate();
之前对 Activity 不可用
MainTask.Class
public class MainTask extends AppCompatActivity {
public static final String mypreference = "mypref";
public static String Name = "nameKey";
SharedPreferences taskcount, currenttime;
public static int completask;
long shared_time;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_task);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
ViewPager viewPager = (ViewPager) findViewById(R.id.viewPager);
setupViewPager(viewPager);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabLayout);
tabLayout.setupWithViewPager(viewPager);//setting tab over viewpager
taskcount = getSharedPreferences(mypreference,
MainActivity.MODE_PRIVATE);
completask = taskcount.getInt(Name, 0);
}
public void propertask(){
final NiftyDialogBuilder dialog1 = NiftyDialogBuilder.getInstance(MainTask.this);
Effectstype effect;
effect = Effectstype.SlideBottom;
dialog1.setCancelable(false);
dialog1.isCancelableOnTouchOutside(false)
.withTitle(null)
.withMessage(null)
.withEffect(effect)
.setCustomView(R.layout.proper_task, MainTask.this)
.show();
Button rate = (Button) dialog1.findViewById(R.id.rate_button);
rate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog1.dismiss();
}
});
dialog1.show();
}
GridListAdapter.Java
if(taskvalue==0)
{
MainTask mainTask=new MainTask();
mainTask.propertask();
}
请帮助我,如何从我的适配器访问 propertask 方法 class。
提前致谢。
永远不要 自己创建一个 activity 的实例(MainTask mainTask=new MainTask()
在你的代码中)。活动由框架创建,以响应 startActivity()
调用。
因为 GridListAdapter
似乎在 MainTask
以外的某些 class 中使用,也许 propertask()
应该是 GridListAdapter
或 activity 或显示 GridListAdapter
.
的片段
您可以将propertask 方法移动到GridListAdapter 中。比您需要此方法的 MainTask Activity 上下文。
您不必为 Activity 创建对象。事实上 CommonsWare 所说的你不应该这样做。
你可以像这样调用那个函数
if(taskvalue==0)
{
// assuming you have passed context to your adapter. If not, then do it.
((MainTask)context).propertask();
}
编辑:
正如您在评论中所说 "you do not have context so you couldn't made Dialog from Adapter"。但是既然你已经通过了它,你现在可以从你的适配器中完成它并删除这个不必要的强制转换为 activity 函数调用。
当我尝试从我的适配器 class 调用一个方法时,我收到一个错误系统服务在 onCreate();
MainTask.Class
public class MainTask extends AppCompatActivity {
public static final String mypreference = "mypref";
public static String Name = "nameKey";
SharedPreferences taskcount, currenttime;
public static int completask;
long shared_time;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_task);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
ViewPager viewPager = (ViewPager) findViewById(R.id.viewPager);
setupViewPager(viewPager);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabLayout);
tabLayout.setupWithViewPager(viewPager);//setting tab over viewpager
taskcount = getSharedPreferences(mypreference,
MainActivity.MODE_PRIVATE);
completask = taskcount.getInt(Name, 0);
}
public void propertask(){
final NiftyDialogBuilder dialog1 = NiftyDialogBuilder.getInstance(MainTask.this);
Effectstype effect;
effect = Effectstype.SlideBottom;
dialog1.setCancelable(false);
dialog1.isCancelableOnTouchOutside(false)
.withTitle(null)
.withMessage(null)
.withEffect(effect)
.setCustomView(R.layout.proper_task, MainTask.this)
.show();
Button rate = (Button) dialog1.findViewById(R.id.rate_button);
rate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog1.dismiss();
}
});
dialog1.show();
}
GridListAdapter.Java
if(taskvalue==0)
{
MainTask mainTask=new MainTask();
mainTask.propertask();
}
请帮助我,如何从我的适配器访问 propertask 方法 class。 提前致谢。
永远不要 自己创建一个 activity 的实例(MainTask mainTask=new MainTask()
在你的代码中)。活动由框架创建,以响应 startActivity()
调用。
因为 GridListAdapter
似乎在 MainTask
以外的某些 class 中使用,也许 propertask()
应该是 GridListAdapter
或 activity 或显示 GridListAdapter
.
您可以将propertask 方法移动到GridListAdapter 中。比您需要此方法的 MainTask Activity 上下文。
您不必为 Activity 创建对象。事实上 CommonsWare 所说的你不应该这样做。
你可以像这样调用那个函数
if(taskvalue==0)
{
// assuming you have passed context to your adapter. If not, then do it.
((MainTask)context).propertask();
}
编辑: 正如您在评论中所说 "you do not have context so you couldn't made Dialog from Adapter"。但是既然你已经通过了它,你现在可以从你的适配器中完成它并删除这个不必要的强制转换为 activity 函数调用。