После выполнения учебника для создания простого Android Java приложения для рисования у меня есть приложение с 3 вкладками (приложение нижней панели навигации), которое позволяет мне рисовать на первом представлении / вкладка (HomeFragment) в порядке. Рисование отлично работает! Но мне нужно подключить функцию очистки, и у меня возникают проблемы с этим. Кроме того, как ни странно, если я нарисую что-нибудь в режиме рисования, а затем перейду к любой из двух других вкладок, мой рисунок исчезнет, когда я вернусь на первую вкладку (HomeFragment). Может ли кто-нибудь предложить решение здесь или связать меня с решением, которое будет работать с таким многопрофильным приложением, как мое? Я нашел множество решений для приложений рисования с одним представлением, но я столкнулся с потоком проблем с нулевым указателем, когда пытаюсь реализовать эти решения для своего приложения с несколькими представлениями, потому что я не инициализирую и не создаю экземпляры необходимых объектов правильно.
Любые отзывы и предложения будут очень благодарны!
Вот моя MainActivity. java file:
import com.example.mobile_testapp_android_2.ui.home.PaintView;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
PaintView paintView = new PaintView(this);
//setContentView(paintView);
setContentView(R.layout.activity_main);
BottomNavigationView navView = findViewById(R.id.nav_view);
// Passing each menu ID as a set of Ids because each
// menu should be considered as top level destinations.
AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(
R.id.navigation_home, R.id.navigation_gui, R.id.navigation_calendar)
.build();
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
NavigationUI.setupWithNavController(navView, navController);
}
}
Вот мой HomeFragment:
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import com.example.mobile_testapp_android_2.R;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
public class HomeFragment extends Fragment {
private PaintView paintView;
@Override
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
PaintView homeFragmentView = new PaintView(requireContext());
this.paintView = new PaintView(requireContext());
return homeFragmentView;
}
//Enable Clear Menu in this fragment
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
setHasOptionsMenu(true);
super.onCreate(savedInstanceState);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
//inflate menu
inflater.inflate(R.menu.menu_swipes, menu);
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
//Handle menu item clicks here
int id = item.getItemId();
if (id == R.id.action_clearScreen) {
//do clear function here:
paintView.clearView();
Toast.makeText(getActivity(), "Clear Screen", Toast.LENGTH_SHORT).show();
}
return super.onOptionsItemSelected(item);
}
}
Вот мой PaintView:
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
public class PaintView extends View {
public ViewGroup.LayoutParams params;
private Path myPath = new Path();
private Paint brush = new Paint();
private boolean forceClear;
public PaintView(Context context) {
super(context);
brush.setAntiAlias(true);
brush.setColor(Color.MAGENTA);
brush.setStyle(Paint.Style.STROKE);
brush.setStrokeJoin(Paint.Join.ROUND);
brush.setStrokeWidth(8f);
params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
}
//Clear function
public void clearView() {
try {
forceClear = true;
invalidate();
} catch (Exception ee) {
Log.d("Clear Button: ", "We blew up!! " + ee);
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float pointX = event.getX();
float pointY = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
myPath.moveTo(pointX, pointY);
return true;
case MotionEvent.ACTION_MOVE:
myPath.lineTo(pointX, pointY);
break;
default:
return false;
}
//Update the screen
postInvalidate();
return false;
}
@Override
protected void onDraw(Canvas canvas) {
if (forceClear) {
canvas.drawColor(Color.WHITE);
forceClear = false;
} else {
canvas.drawPath(myPath, brush);
}
}
}
Вот скриншоты моего приложения:
[ 3 [] 4