Java ImageButton无法处理片段,单击ImageButton时崩溃
问题:我在FragmentHome上有一个ImageButton,我试图实现这个按钮来打开AddEntry片段,以便用户可以向数据库添加信息。每次单击ImageButton时,它都会崩溃:/ 我还在学习Android Studio/Java,这是我第一次开发应用程序 再次感谢你 日志:Java ImageButton无法处理片段,单击ImageButton时崩溃,java,android,android-fragments,onclicklistener,imagebutton,Java,Android,Android Fragments,Onclicklistener,Imagebutton,问题:我在FragmentHome上有一个ImageButton,我试图实现这个按钮来打开AddEntry片段,以便用户可以向数据库添加信息。每次单击ImageButton时,它都会崩溃:/ 我还在学习Android Studio/Java,这是我第一次开发应用程序 再次感谢你 日志: 04-06 01:10:12.873 5449-5449/com.example.treycoco.calorietracker E/AndroidRuntime: FATAL EXCEPTION: mai
04-06 01:10:12.873 5449-5449/com.example.treycoco.calorietracker E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.treycoco.calorietracker, PID: 5449
java.lang.IllegalStateException: Could not find method Click(View) in a parent or ancestor Context for android:onClick attribute defined on view class android.support.v7.widget.AppCompatImageButton with id 'AddItems'
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.resolveMethod(AppCompatViewInflater.java:325)
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:284)
at android.view.View.performClick(View.java:5697)
at android.view.View$PerformClick.run(View.java:22526)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7229)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
更新日志:
04-06 01:32:18.745 30188-30188/com.example.treycoco.calorietracker E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.treycoco.calorietracker, PID: 30188
java.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.View.getId()' on a null object reference
at com.example.treycoco.calorietracker.FragmentHome$1.onClick(FragmentHome.java:61)
at android.view.View.performClick(View.java:5697)
at android.view.View$PerformClick.run(View.java:22526)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7229)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
fragment_home.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:fab="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorBackground"
tools:context="layout.HomeFragment"
android:id="@+id/HomeFragment">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:weightSum="1"
android:id="@+id/linearLayout">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Welcome,"
android:id="@+id/textView"
android:layout_alignParentTop="true"
android:layout_alignParentStart="true" />
<TextView
android:layout_width="138dp"
android:layout_height="36dp"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="@string/emptyString"
android:id="@+id/User"
android:layout_gravity="center_horizontal|top"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true" />
<TextView android:id="@+id/section_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="left"
android:layout_below="@+id/linearLayout2"
android:layout_centerHorizontal="true" />
</LinearLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="355dp"
android:layout_gravity="center|bottom">
<ListView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:id="@+id/listView"
android:layout_gravity="center_horizontal"
android:layout_alignParentBottom="true"
android:layout_alignParentStart="true" />
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/AddItems"
android:layout_alignParentBottom="true"
android:layout_alignParentEnd="true"
android:src="@drawable/add"
android:background="@color/colorBackground"
android:onClick="Click"
android:clickable="true" />
</RelativeLayout>
</FrameLayout>
appMain.java
public class appMain extends AppCompatActivity implements
AdapterView.OnItemClickListener {
private ActionBarDrawerToggle actionBarDrawerToggle;
public static String dateFormat = "E MMM d yyyy";
private DrawerLayout drawerLayout;
private ListView drawerList;
private android.support.v4.app.FragmentManager fragmentManager;
private FragmentTransaction fragmentTransaction;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.app_main);
drawerLayout=(DrawerLayout)findViewById(R.id.drawerlayout);
drawerList= (ListView) findViewById(R.id.drawerList);
ArrayList<String> ListArray= new ArrayList<String>();
ListArray.add("home");
ListArray.add("Add Calories");
ListArray.add("Bmi Tracker");
ListArray.add("About App");
ListArray.add("Settings");
ListArray.add("Logout");
drawerList.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
ArrayAdapter<String> adapter= new ArrayAdapter<String>(this,android.R.layout.simple_list_item_activated_1,ListArray);
drawerList.setAdapter(adapter);
drawerList.setOnItemClickListener(this);
actionBarDrawerToggle=new ActionBarDrawerToggle(this,drawerLayout,R.string.navigation_drawer_open,
R.string.navigation_drawer_close);
drawerLayout.setDrawerListener(actionBarDrawerToggle);
ActionBar actionBar= getSupportActionBar();
actionBar.setDisplayShowHomeEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);
String username = getIntent().getStringExtra("Username");
TextView userMain = (TextView) findViewById(R.id.User);
userMain.setText(username);
fragmentManager=getSupportFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
loadSelection(0);
}
private void loadSelection(int i){
drawerList.setItemChecked(i,true);
switch (i) {
case 0:
FragmentHome homeFragment = new FragmentHome();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.addToBackStack(null);
fragmentTransaction.replace(R.id.FragmentHolder, homeFragment)
.commit();
break;
case 1:
AddEntry addEntry = new AddEntry();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.addToBackStack(null);
fragmentTransaction.replace(R.id.FragmentHolder,addEntry)
.commit();
break;
case 2:
BmiFrag myBiFragment = new BmiFrag();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.addToBackStack(null);
fragmentTransaction.replace(R.id.FragmentHolder, myBiFragment)
.commit();
break;
case 3:
AboutApp aboutApp = new AboutApp();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.addToBackStack(null);
fragmentTransaction.replace(R.id.FragmentHolder, aboutApp)
.commit();
break;
case 4 :
break;
}
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
actionBarDrawerToggle.syncState();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id=item.getItemId();
if ( id==R.id.action_settings){
return true;
}
else if (id==android.R.id.home){
if(drawerLayout.isDrawerOpen(drawerList)){
drawerLayout.closeDrawer(drawerList);
}
else {
drawerLayout.openDrawer(drawerList);
}
}
return super.onOptionsItemSelected(item);
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
switch (position){
case 0:
loadSelection(position);
break;
case 1:
loadSelection(position);
break;
case 2:
loadSelection(position);
break;
case 3:
loadSelection(position);
break;
case 4:
loadSelection(position);
break;
case 5:
Intent i = new Intent(this, MainActivity.class);
startActivity(i);
break;
}
drawerLayout.closeDrawer(drawerList);
}
public void setTitle(String title) {
getSupportActionBar().setTitle(title);
}
public void ButtonClick (View v) {
switch (v.getId()) {
case R.id.BtnBMi:
break;
}
}
public void loadSelection(int i){
drawerList.setItemChecked(i,true);
switch (i) {
case 0:
FragmentHome homeFragment = new FragmentHome();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.addToBackStack(null);
fragmentTransaction.replace(R.id.FragmentHolder, homeFragment)
.commit();
break;
case 1:
AddEntry addEntry = new AddEntry();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.addToBackStack(null);
fragmentTransaction.replace(R.id.FragmentHolder,addEntry)
.commit();
break;
case 2:
BmiFrag myBiFragment = new BmiFrag();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.addToBackStack(null);
fragmentTransaction.replace(R.id.FragmentHolder, myBiFragment)
.commit();
break;
case 3:
AboutApp aboutApp = new AboutApp();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.addToBackStack(null);
fragmentTransaction.replace(R.id.FragmentHolder, aboutApp)
.commit();
break;
case 4 :
AddEntry addEntry = new AddEntry();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.addToBackStack(null);
fragmentTransaction.replace(R.id.FragmentHolder,addEntry)
.commit();
break;
}
}
公共类appMain扩展了AppCompatActivity实现
AdapterView.OnItemClickListener{
私人动作bardrawertoggle动作bardrawertoggle;
公共静态字符串dateFormat=“E MMM d yyy”;
私人抽屉布局;
私有列表视图抽屉列表;
私有android.support.v4.app.FragmentManager FragmentManager;
私人碎片交易;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.app_main);
抽屉布局=(抽屉布局)findViewById(R.id.抽屉布局);
抽屉列表=(ListView)findViewById(R.id.抽屉列表);
ArrayList ListArray=新的ArrayList();
添加(“主”);
添加(“添加卡路里”);
添加(“Bmi跟踪器”);
添加(“关于应用程序”);
添加(“设置”);
添加(“注销”);
抽屉列表.setChoiceMode(ListView.CHOICE\u MODE\u SINGLE);
ArrayAdapter=新的ArrayAdapter(这是android.R.layout.simple\u list\u item\u activated\u 1,ListArray);
抽屉列表设置适配器(适配器);
drawerList.setonicmclicklistener(this);
actionBarDrawerToggle=新actionBarDrawerToggle(此,抽屉布局,R.string.navigation\u抽屉打开,
R.string.navigation\u drawer\u close);
抽屉布局。setDrawerListener(actionBarDrawerToggle);
ActionBar ActionBar=getSupportActionBar();
actionBar.setDisplayShowHomeEnabled(真);
actionBar.setDisplayHomeAsUpEnabled(true);
字符串username=getIntent().getStringExtra(“用户名”);
TextView userMain=(TextView)findViewById(R.id.User);
userMain.setText(用户名);
fragmentManager=getSupportFragmentManager();
fragmentTransaction=fragmentManager.beginTransaction();
负荷选择(0);
}
专用void加载选择(int i){
抽屉列表。setItemChecked(i,true);
开关(一){
案例0:
FragmentHomeFragment=新的FragmentHome();
fragmentTransaction=fragmentManager.beginTransaction();
fragmentTransaction.addToBackStack(空);
fragmentTransaction.replace(R.id.FragmentHolder,homeFragment)
.commit();
打破
案例1:
AddEntry AddEntry=新的AddEntry();
fragmentTransaction=fragmentManager.beginTransaction();
fragmentTransaction.addToBackStack(空);
碎片交易。替换(R.id.碎片持有人,附录)
.commit();
打破
案例2:
BmiFrag myBiFragment=新的BmiFrag();
fragmentTransaction=fragmentManager.beginTransaction();
fragmentTransaction.addToBackStack(空);
碎片交易。替换(R.id.碎片持有人,myBiFragment)
.commit();
打破
案例3:
AboutApp AboutApp=新的AboutApp();
fragmentTransaction=fragmentManager.beginTransaction();
fragmentTransaction.addToBackStack(空);
碎片交易。更换(R.id.碎片持有人,aboutApp)
.commit();
打破
案例4:
打破
}
}
@凌驾
后期创建时受保护的空(捆绑包savedInstanceState){
super.onPostCreate(savedInstanceState);
actionBarDrawerToggle.syncState();
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
getMenuInflater().充气(右菜单菜单菜单主菜单);
返回true;
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
int id=item.getItemId();
if(id==R.id.action\u设置){
返回true;
}
else if(id==android.R.id.home){
if(抽屉布局isDrawerOpen(抽屉列表)){
抽屉布局。封闭抽屉(抽屉列表);
}
否则{
抽屉布局。打开抽屉(抽屉列表);
}
}
返回super.onOptionsItemSelected(项目);
}
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
开关(位置){
案例0:
载荷选择(位置);
打破
案例1:
载荷选择(位置);
打破
案例2:
载荷选择(位置);
打破
案例3:
载荷选择(位置);
打破
案例4:
载荷选择(位置);
打破
案例5:
意图i=新意图(此,MainActivity.class);
星触觉(i);
打破
}
抽屉布局。封闭抽屉(抽屉列表);
}
公共无效集合标题(字符串标题){
getSupportActionBar().setTitle(标题);
}
公共无效按钮单击(视图v){
开关(v.getId()){
案例R.id.BtnBMi:
打破
}
}
}首先删除android:onClick=“Click”
在创建视图的
视图部分中添加此项。取出onClick中的代码
case R.id.AddItems:
AddEntry addEntry = new AddEntry();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.addToBackStack(null);
fragmentTransaction.replace(R.id.FragmentHolder,addEntry)
.commit();
break;
}
并将其放入方法单击中
例如:
private void Click{
AddEntry addEntry = new AddEntry();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.addToBackStack(null);
fragmentTransaction.replace(R.id.FragmentHolder,addEntry)
.commit();
}首先:删除xml中的行android:onClick=“Click”
第二:删除onActivityCreated中的行
AddEntrybtn = (ImageButton) getView().findViewById(R.id.AddItems);
第三:在onCreateView中调用它
AddEntrybtn = (ImageButton) myView.findViewById(R.id.AddItems);
AddEntrybtn.setOnClickListener(this);
在fragment_主代码中:
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/AddItems"
android:layout_alignParentBottom="true"
android:layout_alignParentEnd="true"
android:src="@drawable/add"
android:background="@color/colorBackground"
/>
添加appMain.java方法
public class appMain extends AppCompatActivity implements
AdapterView.OnItemClickListener {
private ActionBarDrawerToggle actionBarDrawerToggle;
public static String dateFormat = "E MMM d yyyy";
private DrawerLayout drawerLayout;
private ListView drawerList;
private android.support.v4.app.FragmentManager fragmentManager;
private FragmentTransaction fragmentTransaction;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.app_main);
drawerLayout=(DrawerLayout)findViewById(R.id.drawerlayout);
drawerList= (ListView) findViewById(R.id.drawerList);
ArrayList<String> ListArray= new ArrayList<String>();
ListArray.add("home");
ListArray.add("Add Calories");
ListArray.add("Bmi Tracker");
ListArray.add("About App");
ListArray.add("Settings");
ListArray.add("Logout");
drawerList.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
ArrayAdapter<String> adapter= new ArrayAdapter<String>(this,android.R.layout.simple_list_item_activated_1,ListArray);
drawerList.setAdapter(adapter);
drawerList.setOnItemClickListener(this);
actionBarDrawerToggle=new ActionBarDrawerToggle(this,drawerLayout,R.string.navigation_drawer_open,
R.string.navigation_drawer_close);
drawerLayout.setDrawerListener(actionBarDrawerToggle);
ActionBar actionBar= getSupportActionBar();
actionBar.setDisplayShowHomeEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);
String username = getIntent().getStringExtra("Username");
TextView userMain = (TextView) findViewById(R.id.User);
userMain.setText(username);
fragmentManager=getSupportFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
loadSelection(0);
}
private void loadSelection(int i){
drawerList.setItemChecked(i,true);
switch (i) {
case 0:
FragmentHome homeFragment = new FragmentHome();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.addToBackStack(null);
fragmentTransaction.replace(R.id.FragmentHolder, homeFragment)
.commit();
break;
case 1:
AddEntry addEntry = new AddEntry();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.addToBackStack(null);
fragmentTransaction.replace(R.id.FragmentHolder,addEntry)
.commit();
break;
case 2:
BmiFrag myBiFragment = new BmiFrag();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.addToBackStack(null);
fragmentTransaction.replace(R.id.FragmentHolder, myBiFragment)
.commit();
break;
case 3:
AboutApp aboutApp = new AboutApp();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.addToBackStack(null);
fragmentTransaction.replace(R.id.FragmentHolder, aboutApp)
.commit();
break;
case 4 :
break;
}
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
actionBarDrawerToggle.syncState();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id=item.getItemId();
if ( id==R.id.action_settings){
return true;
}
else if (id==android.R.id.home){
if(drawerLayout.isDrawerOpen(drawerList)){
drawerLayout.closeDrawer(drawerList);
}
else {
drawerLayout.openDrawer(drawerList);
}
}
return super.onOptionsItemSelected(item);
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
switch (position){
case 0:
loadSelection(position);
break;
case 1:
loadSelection(position);
break;
case 2:
loadSelection(position);
break;
case 3:
loadSelection(position);
break;
case 4:
loadSelection(position);
break;
case 5:
Intent i = new Intent(this, MainActivity.class);
startActivity(i);
break;
}
drawerLayout.closeDrawer(drawerList);
}
public void setTitle(String title) {
getSupportActionBar().setTitle(title);
}
public void ButtonClick (View v) {
switch (v.getId()) {
case R.id.BtnBMi:
break;
}
}
public void loadSelection(int i){
drawerList.setItemChecked(i,true);
switch (i) {
case 0:
FragmentHome homeFragment = new FragmentHome();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.addToBackStack(null);
fragmentTransaction.replace(R.id.FragmentHolder, homeFragment)
.commit();
break;
case 1:
AddEntry addEntry = new AddEntry();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.addToBackStack(null);
fragmentTransaction.replace(R.id.FragmentHolder,addEntry)
.commit();
break;
case 2:
BmiFrag myBiFragment = new BmiFrag();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.addToBackStack(null);
fragmentTransaction.replace(R.id.FragmentHolder, myBiFragment)
.commit();
break;
case 3:
AboutApp aboutApp = new AboutApp();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.addToBackStack(null);
fragmentTransaction.replace(R.id.FragmentHolder, aboutApp)
.commit();
break;
case 4 :
AddEntry addEntry = new AddEntry();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.addToBackStack(null);
fragmentTransaction.replace(R.id.FragmentHolder,addEntry)
.commit();
break;
}
}
stacktrace看起来不完整。。。。添加所有msgWhy是您的ImageButton在onActivityCreated declate中声明的
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View myView = inflater.inflate(R.layout.fragment_home, container,
false);
label= (TextView) myView.findViewById(R.id.section_label);
ImageButton btn = (ImageButton) myView.findViewById(R.id.AddItems);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
//Call the Activity method where you add fragments
((appMain)getActivity()).loadSelection(4);
}
});
return myView;
}
public void loadSelection(int i){
drawerList.setItemChecked(i,true);
switch (i) {
case 0:
FragmentHome homeFragment = new FragmentHome();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.addToBackStack(null);
fragmentTransaction.replace(R.id.FragmentHolder, homeFragment)
.commit();
break;
case 1:
AddEntry addEntry = new AddEntry();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.addToBackStack(null);
fragmentTransaction.replace(R.id.FragmentHolder,addEntry)
.commit();
break;
case 2:
BmiFrag myBiFragment = new BmiFrag();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.addToBackStack(null);
fragmentTransaction.replace(R.id.FragmentHolder, myBiFragment)
.commit();
break;
case 3:
AboutApp aboutApp = new AboutApp();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.addToBackStack(null);
fragmentTransaction.replace(R.id.FragmentHolder, aboutApp)
.commit();
break;
case 4 :
AddEntry addEntry = new AddEntry();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.addToBackStack(null);
fragmentTransaction.replace(R.id.FragmentHolder,addEntry)
.commit();
break;
}
}