![](/img/trans.png)
[英]Type Cannot make a static reference to the non-static method setVisibility(int) from the type View
[英]Cannot make a static reference to the non-static method setOnTouchListener(View.OnTouchListener) from the type View
場景:
我創建了一個應用程序抽屜,並在其中放置了一個搜索欄。 這個應用程序抽屜由app_drawer.xml組成,而我下面的片段由main_activity.xml組成。 我遇到的問題是 ,盡管搜索欄顯示得很完美,並且應用程序抽屜可以按原樣拉入和拉出,但是當我拖動它時,什么也沒發生(這是指textview沒有更新)。 即使應該。
有人告訴我以下是修復程序,但我不斷收到錯誤消息:
無法從視圖類型靜態引用非靜態方法setOnTouchListener(View.OnTouchListener)
如何擺脫錯誤?
使用建議的代碼修復:
public class MainActivity extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.main_activity, container, false);
View rootView2 = inflater.inflate(R.layout.app_drawer, container, false);
final SeekBar sk=(SeekBar) rootView2.findViewById(R.id.seekBar1);
SeekBar.setOnTouchListener(new WorkarroundFixMovementOnDrawer());
TextView textProgress = (TextView)rootView.findViewById(R.id.TextView01);
sk.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
public void onProgressChanged(SeekBar bar, int progress,
boolean fromUser) {
textProgress.setText("Progress: "+ String.valueOf(progress));
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
});
return rootView;
}
}
/**
* This is just a workarround for make seekbar work on drawer
*/
static class WorkarroundFixMovementOnDrawer implements View.OnTouchListener {
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
DrawerLayout parentDrawer = getParentDrawer(v);
switch (action) {
case MotionEvent.ACTION_DOWN:
// Disallow Drawer to intercept touch events.
if (parentDrawer != null) {
parentDrawer.requestDisallowInterceptTouchEvent(true);
}
break;
case MotionEvent.ACTION_UP:
// Allow Drawer to intercept touch events.
if (parentDrawer != null) {
parentDrawer.requestDisallowInterceptTouchEvent(false);
}
break;
}
// Handle seekbar touch events.
v.onTouchEvent(event);
return true;
}
/**
* Try to get DrawerLayout from parent
* @param view view to search
* @return the drawerLayout parent
*/
public static DrawerLayout getParentDrawer(View view) {
if (view != null) {
ViewParent recursiveView = view.getParent();
while (!(recursiveView instanceof DrawerLayout)) {
if (recursiveView == null) {
return null;
}
recursiveView = recursiveView.getParent();
}
return (DrawerLayout) recursiveView;
}
return null;
}
}
原始代碼:
public class MainActivity extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.main_activity, container, false);
View rootView2 = inflater.inflate(R.layout.app_drawer, container, false);
final SeekBar sk=(SeekBar) rootView2.findViewById(R.id.seekBar1);
TextView textProgress = (TextView)rootView.findViewById(R.id.TextView01);
sk.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
public void onProgressChanged(SeekBar bar, int progress,
boolean fromUser) {
textProgress.setText("Progress: "+ String.valueOf(progress));
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
});
return rootView;
}
}
建議的修復:
seekBar.setOnTouchListener(new WorkarroundFixMovementOnDrawer());
/**
* This is just a workarround for make seekbar work on drawer
*/
static class WorkarroundFixMovementOnDrawer implements View.OnTouchListener {
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
DrawerLayout parentDrawer = getParentDrawer(v);
switch (action) {
case MotionEvent.ACTION_DOWN:
// Disallow Drawer to intercept touch events.
if (parentDrawer != null) {
parentDrawer.requestDisallowInterceptTouchEvent(true);
}
break;
case MotionEvent.ACTION_UP:
// Allow Drawer to intercept touch events.
if (parentDrawer != null) {
parentDrawer.requestDisallowInterceptTouchEvent(false);
}
break;
}
// Handle seekbar touch events.
v.onTouchEvent(event);
return true;
}
/**
* Try to get DrawerLayout from parent
* @param view view to search
* @return the drawerLayout parent
*/
public static DrawerLayout getParentDrawer(View view) {
if (view != null) {
ViewParent recursiveView = view.getParent();
while (!(recursiveView instanceof DrawerLayout)) {
if (recursiveView == null) {
return null;
}
recursiveView = recursiveView.getParent();
}
return (DrawerLayout) recursiveView;
}
return null;
}
}
setOntouchListener
是一個接口。
你有
final SeekBar sk=(SeekBar) rootView2.findViewById(R.id.seekBar1);
SeekBar.setOnTouchListener(new WorkarroundFixMovementOnDrawer());
應該
sk.setOnTouchListener(new WorkarroundFixMovementOnDrawer());
因為你有
class WorkarroundFixMovementOnDrawer implements View.OnTouchListener
您的WorkarroundFixMovementOnDrawer
實現了View.OnTouchListener
接口。
更改
TextView textProgress = (TextView)rootView.findViewById(R.id.TextView01);
至
textProgress = (TextView)rootView.findViewById(R.id.TextView01);
並向您的班級添加一個對象
public class MainActivity extends Fragment {
TextView textProgress;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.