我正在尝试从主要活动调用片段方法。但我的应用程序正在崩溃
这是我的代码:
public class MainActivity extends FragmentActivity implements
ActionBar.TabListener,ConversationFragment.OnGetFromUserClickListener {
ConversationFragment frgObj;
Hashtable<String, ArrayList<Message>> table = new Hashtable<String, ArrayList<Message>>();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
addMessageToFragment("test");
}
public void addMessageToFragment(String message) {
Log.w("Step 1",message);
table.put("tolgay", new ArrayList<Message>());
table.get("tolgay").add(new Message("asda", "asda"));
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
frgObj=ConversationFragment.newInstance(table.get("tolgay"));
fragmentTransaction.replace(R.id.container, frgObj,"ConversationFragment");
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
getSupportFragmentManager().executePendingTransactions();
frgObj.addMessageToList("asd");
}
}
这段代码有什么问题?我想在oncreate方法中加载带有一些数据的片段。我该如何修复它?
这里是logcat:http://goo.gl/id4UmY
答案 0 :(得分:0)
您的NPE就在这一排:
table.get("tolgay").add(new Message("asda", "asda"));
由于table
初始化为非空,因此这里NPE的唯一可能性是table.get("tolgay")
返回null。哈希表不包含具有此键的消息。如果不存在,请使用put()
插入新密钥。
另请考虑使用HashMap
代替Hashtable
。在像这样运行在单个线程中的UI代码中,您不需要Hashtable
提供的同步。
答案 1 :(得分:0)
我的建议是简单地创建你的片段实例,添加Bundle然后使用 setArguments()方法在片段上设置它。只需确保您设置的数据不为空。
然后在你的片段中(可能在onAttach或onCreate或onActivityCreated方法中,只需使用它:
Bundle bundle = this.getArguments();
然后检索之前添加的数据。
我希望这可以帮到你!