情况: 我正在与Skype一起制作聊天应用程序。联系人回收站视图位于左侧。 我有基于ActionBar的自定义主题。
我需要在ActionBar onClick上设置标题。
所以,基本上,onClick方法在Adapter中。单击联系人时,该方法将传递给具有ActionBar的Activity,并且联系人的姓名应该出现在标题中。
getActionBar()运行完美,Title在onCreate方法中设置。但是,当我在onCreate之外的方法中执行相同操作时,app会崩溃。 我提到了链接here和here,但我无法解决我的问题。
请指导我。
示例:
ChatActivity extends Activity {
//..onCreate here
if(getActionBar() != null) {
String title = " Chat: ";
if(userName != null) {
title = title + userName;
}
getActionBar().setTitle(title);
}
// onCreate finishes
// onContactChange
public void onContactChange(int position, ContactsVO addContact) {
userName = addContact.getName().toString();
String url = addContact.getDP();
if(getActionBar() != null) { //App crashes here
String title =" Chat: ";
if(userName != null)
title = title + userTo;
getActionBar().setTitle(title);
}
}
}
调用异步任务,webservice返回适配器中设置的数据。
现在, 在适配器中,
ChatActivity c1 = new ChatActivity();
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
ContactsVO contactsvo = data.get(position);
holder.tv.setText(contactsvo.getName());
String url = contactsvo.getDP();
Glide.with(getContext())
.load(url)
.crossFade()
.into(holder.img);
holder.row.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
c1.onContactChange(position,contactsvo); //method called here.
}
});
}
堆栈跟踪
E / ACRA:ACRA捕获了com.chat的NullPointerException异常 建立报告。 11-20 15:51:23.278 12797-12941 /? E / ACRA:com.chat 致命错误:尝试调用虚拟方法' android.view.View android.view.Window.getDecorView()'在null对象引用上 java.lang.NullPointerException:尝试调用虚方法 ' android.view.View android.view.Window.getDecorView()'在null 对象参考 在android.app.Activity.initWindowDecorActionBar(Activity.java:2397) 在android.app.Activity.getActionBar(Activity.java:2339) 在com.chat.activities.ChatActivity.onContactChange(ChatActivity.java:276) 在com.chat.utilities.adapters.ChatCustomAdapter $ 1.onClick(ChatCustomAdapter.java:74) 在android.view.View.performClick(View.java:5678) 在android.view.View $ PerformClick.run(View.java:22667) 在android.os.Handler.handleCallback(Handler.java:836) 在android.os.Handler.dispatchMessage(Handler.java:103) 在android.os.Looper.loop(Looper.java:203) 在android.app.ActivityThread.main(ActivityThread.java:6293) at java.lang.reflect.Method.invoke(Native Method) 在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1065) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:926)
请指导我解决同样的问题。
答案 0 :(得分:0)
我的建议是使用setSupportActionBar()进行整个活动。 在你的布局中。
<android.support.v7.widget.Toolbar
android:id="@+id/home_activity_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:layout_scrollFlags="scroll|enterAlways" />
//OnCreate
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home_page);
toolbar = (Toolbar) findViewById(R.id.home_activity_toolbar);
configureHomeToolBar();
}
private void configureHomeToolBar() {
toolbar.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.colorPrimary));
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowHomeEnabled(true);
getSupportActionBar().setDisplayShowTitleEnabled(false);
getSupportActionBar().setIcon(R.drawable.my_logo);
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
}
然后,您可以通过在活动中的任意位置调用getSupportActionBar()
来使用它,例如:
getSupportActionBar().setDisplayUseLogoEnabled(false);
getSupportActionBar().setTitle(titlesArray[someIndex]);