Java onCreateView中的if块不是';t执行
我正在构建一个有多个片段的应用程序,其中大约一半的片段包含一个用户可以用手指画线的视图(我们称之为画布)。我试图做的是保存用户绘制的线条,然后用户将片段留给另一个片段,并在该片段的画布上绘制一些线条,然后可以返回到前一个片段(第二个片段的绘图将被保存),其中该片段的绘图只会显示在画布中。如果用户返回到第二个片段,则仅显示第二个片段的图形。我正在使用可包裹界面 但是,如果在一个片段中的一个画布上绘制图形,那么该图形也将在另一个片段中显示,并且任何新添加的内容都将在第一个画布中显示 在使用了multiple Log.d之后,我注意到它没有进入检查savedInstanceState是否为null的if语句 片段一 每个片段本质上都是相同的代码,只是获得了不同的画布idJava onCreateView中的if块不是';t执行,java,android,android-fragments,Java,Android,Android Fragments,我正在构建一个有多个片段的应用程序,其中大约一半的片段包含一个用户可以用手指画线的视图(我们称之为画布)。我试图做的是保存用户绘制的线条,然后用户将片段留给另一个片段,并在该片段的画布上绘制一些线条,然后可以返回到前一个片段(第二个片段的绘图将被保存),其中该片段的绘图只会显示在画布中。如果用户返回到第二个片段,则仅显示第二个片段的图形。我正在使用可包裹界面 但是,如果在一个片段中的一个画布上绘制图形,那么该图形也将在另一个片段中显示,并且任何新添加的内容都将在第一个画布中显示 在使用了mult
导入android.os.Bundle;
导入android.util.DisplayMetrics;
导入android.util.Log;
导入android.view.LayoutInflater;
导入android.view.Menu;
导入android.view.MenuInflater;
导入android.view.MenuItem;
导入android.view.view;
导入android.view.ViewGroup;
导入androidx.annotation.NonNull;
导入androidx.annotation.Nullable;
导入androidx.fragment.app.fragment;
公共类LineLHwFragment扩展了片段{
私人画景画景;
@可空
@凌驾
创建视图时的公共视图(@NonNull LayoutInflater inflater、@Nullable ViewGroup container、@Nullable Bundle savedInstanceState){
视图v=充气机。充气(右布局。碎片线,容器,假);
paintView=v.findviewbyd(R.id.linelpainview);
//如果未执行此代码,logcat将显示:first if line fail:
//onCreateView:如果行失败,则为第一行
如果(savedInstanceState!=null){
Log.d(“第一行如果成功”,“onCreateView:第一行如果成功”);
if(savedInstanceState.containsKey(“线路测试”)){
Log.d(“行如果工作”,“onCreateView:行如果工作”);
设置路径(savedInstanceState.getParcelableArrayList(“行测试”));
}否则{
Log.d(“行失败”,“onCreateView:行失败”);
}
}否则{
Log.d(“第一行失败”,“onCreateView:第一行失败”);
}
DisplayMetrics=新的DisplayMetrics();
getActivity().getWindowManager().getDefaultDisplay().getMetrics(度量);
paintView.init(度量);
设置选项菜单(真);
返回v;
}
@凌驾
创建选项菜单(菜单菜单,菜单充气机){
充气机。充气(右菜单。主菜单,菜单);
super.onCreateOptions菜单(菜单,充气机);
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
开关(item.getItemId()){
病例R.id.normal:
paintView.normal();
返回true;
案例R.id.clear:
paintView.clear();
返回true;
}
返回super.onOptionsItemSelected(项目);
}
@凌驾
SAVEInstanceState上的公共无效(@NonNull Bundle outState){
super.onSaveInstanceState(超出状态);
putParcelableArrayList(“线测试”,paintView.getpath());
}
}
我尝试过使用其他方法,例如:if(!savedInstanceState.isEmpty()),但这只会导致应用程序崩溃。有没有办法解决这个问题?在片段之间切换时,是否使用
savedInstanceState
获取以前的片段数据,然后返回到在其savedInstanceState
上保存数据的特定片段?我相信我正在检查“onCreateView”中的“savedInstanceState”是否为空,然后检查键它具有适当的arraylist(保存在“onSaveInstanceState”中,我认为我做得正确)并将该数据提供给paintView。我的意思是,如果当您来自另一个片段时调用了onCreateView
,则肯定savedInstanceState
将为空,我只需要知道,如果我第一次访问片段,savedInstanceState
应该为空,但是当我返回时,它不应该为空,并且来自第一个片段的图形应该只保留在相关片段中
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
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 androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
public class LineLHwFragment extends Fragment {
private PaintView paintView;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_line_l_hw, container, false);
paintView = v.findViewById(R.id.lineLPaintView);
// this if code is not getting executed, the logcat will show: first if line fail:
//onCreateView: first if line fail
if (savedInstanceState != null) {
Log.d("first line if success", "onCreateView: first line if success");
if (savedInstanceState.containsKey("line test")) {
Log.d("line if working", "onCreateView: line if working");
paintView.setPaths(savedInstanceState.<FingerPath>getParcelableArrayList("line test"));
} else {
Log.d("line fail", "onCreateView: line fail");
}
} else {
Log.d("first if line fail", "onCreateView: first if line fail");
}
DisplayMetrics metrics = new DisplayMetrics();
getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);
paintView.init(metrics);
setHasOptionsMenu(true);
return v;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.main, menu);
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.normal:
paintView.normal();
return true;
case R.id.clear:
paintView.clear();
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelableArrayList("line test", paintView.getPaths());
}
}