我的应用程序包含几个片段.到目前为止,我已将它们的引用存储在自定义的Application对象中,但我开始认为我做错了.
当我意识到我的片段对mActivity的所有引用在方向改变后变为null时,我的问题就开始了.因此,当我在方向更改后调用getActivity()时,会抛出NullPointerException.我已经检查过我的片段的onAttach()在调用getActivity()之前被调用,但它仍然返回null.
以下是我的MainActivity的剥离版本,它是我的应用程序中唯一的活动.
public class MainActivity extends BaseActivity implements OnItemClickListener,
OnBackStackChangedListener, OnSlidingMenuActionListener {
private ListView mSlidingMenuListView;
private SlidingMenu mSlidingMenu;
private boolean mMenuFragmentVisible;
private boolean mContentFragmentVisible;
private boolean mQuickAccessFragmentVisible;
private FragmentManager mManager;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/*
* Boolean variables indicating which of the 3 fragment slots are visible at a given time
*/
mMenuFragmentVisible = findViewById(R.id.menuFragment) != null;
mContentFragmentVisible = findViewById(R.id.contentFragment) != null;
mQuickAccessFragmentVisible = findViewById(R.id.quickAccessFragment) != null;
if(!savedInstanceState != null) {
if(!mMenuFragmentVisible && mContentFragmentVisible) { …Run Code Online (Sandbox Code Playgroud) 我正在学习android基础知识,我在创建第一个应用程序时遇到了这个问题.我有一个活动将数据传递给片段.OnCreate活动的方法有一个这样的块:
if(savedInstanceState == null){
DetailActivityFragment detailFrag = DetailActivityFragment.newInstance(movieId);
getSupportFragmentManager().beginTransaction().add(android.R.id.content,detailFrag).commit();
}
setContentView(R.layout.activity_detail);
Run Code Online (Sandbox Code Playgroud)
在片段(activity_detail),如果我执行getParameters(),我收到null.通过游戏,我发现如果我setContentView从上面的片段中删除方法,片段会显示数据.关于为什么这是一个问题的任何想法?谢谢!
编辑:这是片段中的静态newInstance方法
public static DetailActivityFragment newInstance(String id) {
DetailActivityFragment fragment = new DetailActivityFragment();
Bundle args = new Bundle();
args.putString(Intent.EXTRA_TEXT, id);
fragment.setArguments(args);
return fragment;
}
Run Code Online (Sandbox Code Playgroud)
这是布局activity_detail中的片段:
<fragment android:name="app.appone.DetailActivityFragment"
android:id="@+id/fragment_detail"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
Run Code Online (Sandbox Code Playgroud) 我已经搜索了SO这个问题,但是找不到能解决我问题的任何东西.我的问题是,我有一个包含FrameLayout的活动,它不断更新不同的片段.顶视图和底视图将保持相同,因此它们位于活动的布局中.
正如您所看到的,底部视图上有一个按钮,我想要在FrameLayout中出现的片段中进行更改.
我创建了一个界面
public interface ShowFormula {
void showFormula(boolean show);
}
Run Code Online (Sandbox Code Playgroud)
我将用于在片段中实现.现在我的MainActivity类中的主要问题我正在尝试初始化接口但不能因为我得到类转换异常
showFormula = (ShowFormula) this;//yes i know this is wrong
Run Code Online (Sandbox Code Playgroud)
我应该如何初始化它以便与片段进行通信.主要目标是在单击活动中的按钮时切换视图.
提前致谢.
我想使用接口无捆绑包将数据从活动传递到捆绑包。请看下面的代码:
接口:
public interface FragmentCommunicator {
public void passData(String name);
}
Run Code Online (Sandbox Code Playgroud)
主要活动
public class MainActivity extends AppCompatActivity{
FragmentCommunicator fragmentCommunicator;
private Fragment fragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button b = (Button) findViewById(R.id.button);
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
fragment= new Fragment();
fragmentCommunicator = (FragmentCommunicator) getApplication();
fragmentCommunicator.passData("hello");
getSupportFragmentManager().beginTransaction().replace(R.id.container ,fragment).commit();
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
分段
public class Fragment extends android.support.v4.app.Fragment implements FragmentCommunicator {
FragmentCommunicator communicator;
Context c;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, …Run Code Online (Sandbox Code Playgroud) 我读了很多文章和 StackOverflow 答案,但仍然无法理解为什么我们需要工厂方法来创建 Fragment 的实例。
以下 Fragment 类都可以正常工作。
具有两个构造函数的片段:
public class CtorFragment extends Fragment {
private static final String KEY = "the_key";
public CtorFragment() {
// Android calls the default constructor so default constructor must be explicitly defined.
// As we have another constructor, Android won't create a default constructor for us.
}
public CtorFragment(String s) {
// Set the arguments.
Bundle bundle = new Bundle();
bundle.putString(KEY, s);
setArguments(bundle);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle …Run Code Online (Sandbox Code Playgroud) 我想将我的片段中的多个值传递给另一个片段.
这是我在片段A中所做的:
mCallback.passData("title","test");
Run Code Online (Sandbox Code Playgroud)
活动:
片段B:
Bundle args = getArguments();
if(args != null){
Toast.makeText(getActivity(), args.getString(NAME_RECEIVE), Toast.LENGTH_LONG).show();
Toast.makeText(getActivity(), args.getString(TITLE_RECEIVE), Toast.LENGTH_LONG).show();
}
Run Code Online (Sandbox Code Playgroud)
但我只从我的捆绑中得到一个论点
谢谢@ cricket_007
我为NAME_RECEIVE和TITLE_RECEIVE传递了2次相同的字符串:
final static String TITLE_RECEIVE = "data_receive";
final static String NAME_RECEIVE = "data_receive";
Run Code Online (Sandbox Code Playgroud)