シナリオ:
アプリ ドロワーを作成し、その中にシークバーを配置しました。このアプリ ドロワーは app_drawer.xml から作成されていますが、以下のフラグメントは main_activity.xml から作成されています。 私が抱えている問題は、シークバーが完全に表示され、アプリの引き出しが必要に応じて引き出されますが、ドラッグすると何も起こりません(つまり、テキストビューが更新されないということです)。すべきなのに。
以下が修正であると言われましたが、エラーが発生し続けます。
タイプ View から非静的メソッド 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;
}
}