从另一个 activity 调用方法崩溃
Calling method from another activity crashes
我正在尝试调用此方法
public void get() {
tileView.smoothScaleFromCenter( 0.5000f );
}
在我的 onItemClick
中来自我的基础活动,但它崩溃了。我该如何解决这个问题?
这是我的基本活动:
public boolean onQueryTextChange(String newText) {
showResults(newText + "*");
return false;
}
public boolean onQueryTextSubmit(String query) {
showResults(query + "*");
return false;
}
public boolean onClose() {
searchView.onActionViewCollapsed();
showResults("");
return false;
}
private void showResults(String query) {
Cursor cursor = mDbHelper.searchPlaces((query != null ? query.toString() : "@@@@"));
if (cursor == null) {
//
} else {
// Specify the columns we want to display in the result
String[] from = new String[]{
PlacesDbAdapter.KEY_PLACES
};
// Specify the Corresponding layout elements where we want the columns to go
int[] to = new int[]{R.id.scustomer
};
// Create a simple cursor adapter for the definitions and apply them to the ListView
SimpleCursorAdapter places1 = new SimpleCursorAdapter(this, R.layout.customerresult, cursor, from, to);
mListView.setAdapter(places1);
// Define the on-click listener for the list items
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
new MainActivity().get();
searchView.setQuery("", true);
}
});
}
}
这是我的主要活动:
public void get() {
tileView.smoothScaleFromCenter( 0.5000f );
}}
这是我的 logcat:
02-26 16:12:21.074 31567-31567/com.example.lightning.myapplication3 E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.lightning.myapplication3, PID: 31567
java.lang.NullPointerException
at com.example.lightning.myapplication3.MainActivity.get(MainActivity.java:208)
at com.example.lightning.myapplication3.BaseActivity.onItemClick(BaseActivity.java:197)
at android.widget.AdapterView.performItemClick(AdapterView.java:299)
at android.widget.AbsListView.performItemClick(AbsListView.java:1156)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:2963)
at android.widget.AbsListView.run(AbsListView.java:3737)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5421)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:979)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:795)
at dalvik.system.NativeStart.main(Native Method)
创建 activity 需要时间。一旦您的 activity 在 new MainActivity()
之后构建,与您的 activity 关联的视图尚未创建或绑定...因此 NullPointerException
.
要实现此功能,您应该将意图传递给 MainActivity。然后在 activity 生命周期的正确点上,您可以检查 activity 的起始意图中是否存在值,然后在需要时执行操作。
例如:
public static final String KEY_SCALE_FROM_CENTER = "scale_from_center";
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
searchView.setQuery("", true);
Intent intent = new Intent(this, MainActivity.class);
intent.putExtra(KEY_SCALE_FROM_CENTER, true);
startActivity(intent);
}
public class MainActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.your_view);
if (getIntent().getBooleanExtra(KEY_SCALE_FROM_CENTER, false)) {
get();
}
}
}
最好尝试这种方式
public class BaseActivity{
// ... fields....
//Define ClickListner on base class or just a setter
OnItemClickListener onItemClickListener;
//.... methods ...
private void showResults(String query) {
// ... lines....
\*mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
new MainActivity().get();
searchView.setQuery("", true);
}
});*/
//replace above with this
if(onItemClickListener!=null)
mListView.setOnItemClickListener(onItemClickListener);
}
//generate setter for that
public void setOnItemClickListener(OnItemClickListener onItemClickListener){
this.onItemClickListener = onItemClickListener;
mListView.setOnItemClickListener(onItemClickListener);
}
}
public class MainActivity extends BaseActivity implements OnItemClickListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentview...
setOnItemClickListener(this);
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
get();
searchView.setQuery("", true);
}
}
在 main activity oncreate 方法中设置此项点击侦听器以便您可以在多个 类
中使用 base activity
更新下行
// 定义列表项的点击监听器
mListView.setOnItemClickListener(onItemClickListener);
现在您已经在 main activity 中定义了 onClick,您不需要这样做:
new MainActivity().get()
这里还有一件事要提到的是 new MainActivity() 创建 mainActivity 的对象并从中调用 get 方法
而不是当前已查看的活动
如果你仍然想调用使用静态方法,我强烈不建议这样做。
我正在尝试调用此方法
public void get() {
tileView.smoothScaleFromCenter( 0.5000f );
}
在我的 onItemClick
中来自我的基础活动,但它崩溃了。我该如何解决这个问题?
这是我的基本活动:
public boolean onQueryTextChange(String newText) {
showResults(newText + "*");
return false;
}
public boolean onQueryTextSubmit(String query) {
showResults(query + "*");
return false;
}
public boolean onClose() {
searchView.onActionViewCollapsed();
showResults("");
return false;
}
private void showResults(String query) {
Cursor cursor = mDbHelper.searchPlaces((query != null ? query.toString() : "@@@@"));
if (cursor == null) {
//
} else {
// Specify the columns we want to display in the result
String[] from = new String[]{
PlacesDbAdapter.KEY_PLACES
};
// Specify the Corresponding layout elements where we want the columns to go
int[] to = new int[]{R.id.scustomer
};
// Create a simple cursor adapter for the definitions and apply them to the ListView
SimpleCursorAdapter places1 = new SimpleCursorAdapter(this, R.layout.customerresult, cursor, from, to);
mListView.setAdapter(places1);
// Define the on-click listener for the list items
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
new MainActivity().get();
searchView.setQuery("", true);
}
});
}
}
这是我的主要活动:
public void get() {
tileView.smoothScaleFromCenter( 0.5000f );
}}
这是我的 logcat:
02-26 16:12:21.074 31567-31567/com.example.lightning.myapplication3 E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.lightning.myapplication3, PID: 31567
java.lang.NullPointerException
at com.example.lightning.myapplication3.MainActivity.get(MainActivity.java:208)
at com.example.lightning.myapplication3.BaseActivity.onItemClick(BaseActivity.java:197)
at android.widget.AdapterView.performItemClick(AdapterView.java:299)
at android.widget.AbsListView.performItemClick(AbsListView.java:1156)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:2963)
at android.widget.AbsListView.run(AbsListView.java:3737)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5421)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:979)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:795)
at dalvik.system.NativeStart.main(Native Method)
创建 activity 需要时间。一旦您的 activity 在 new MainActivity()
之后构建,与您的 activity 关联的视图尚未创建或绑定...因此 NullPointerException
.
要实现此功能,您应该将意图传递给 MainActivity。然后在 activity 生命周期的正确点上,您可以检查 activity 的起始意图中是否存在值,然后在需要时执行操作。
例如:
public static final String KEY_SCALE_FROM_CENTER = "scale_from_center";
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
searchView.setQuery("", true);
Intent intent = new Intent(this, MainActivity.class);
intent.putExtra(KEY_SCALE_FROM_CENTER, true);
startActivity(intent);
}
public class MainActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.your_view);
if (getIntent().getBooleanExtra(KEY_SCALE_FROM_CENTER, false)) {
get();
}
}
}
最好尝试这种方式
public class BaseActivity{
// ... fields....
//Define ClickListner on base class or just a setter
OnItemClickListener onItemClickListener;
//.... methods ...
private void showResults(String query) {
// ... lines....
\*mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
new MainActivity().get();
searchView.setQuery("", true);
}
});*/
//replace above with this
if(onItemClickListener!=null)
mListView.setOnItemClickListener(onItemClickListener);
}
//generate setter for that
public void setOnItemClickListener(OnItemClickListener onItemClickListener){
this.onItemClickListener = onItemClickListener;
mListView.setOnItemClickListener(onItemClickListener);
}
}
public class MainActivity extends BaseActivity implements OnItemClickListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentview...
setOnItemClickListener(this);
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
get();
searchView.setQuery("", true);
}
}
在 main activity oncreate 方法中设置此项点击侦听器以便您可以在多个 类
中使用 base activity更新下行
// 定义列表项的点击监听器
mListView.setOnItemClickListener(onItemClickListener);
现在您已经在 main activity 中定义了 onClick,您不需要这样做:
new MainActivity().get()
这里还有一件事要提到的是 new MainActivity() 创建 mainActivity 的对象并从中调用 get 方法 而不是当前已查看的活动 如果你仍然想调用使用静态方法,我强烈不建议这样做。