0
  1. 我创建了一个项目的Android工作室默认的活动抽屉式导航活动如何指定搜索OnClick方法,当onClick事件上

  2. 然后片段出现创建了两个名为Myfragment1和Myfragment2的新片段。

  3. 然后实现的方法基于从导航抽屉选择的选项上调用适当的片段,我使用LayoutInflater膨胀方法加载这些片段,对于相同的代码已被放置在MainActivity类的方法onCreateView。

  4. Myfragment1片段被加载,如果我点击添加按钮这是对Myfragment1则给出了错误“java.lang.IllegalStateException:无法找到一个方法”。

  5. 我创建按钮的听众在Myfragment1.java的onCreateView文件

  6. 我指定它应该在DatabaseActivity类搜索邻n点击的方法,但它仍然给错误

MainActivity.java

public class MainActivity extends ActionBarActivity 
    implements NavigationDrawerFragment.NavigationDrawerCallbacks { 

     private NavigationDrawerFragment mNavigationDrawerFragment; 
     private CharSequence mTitle; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mNavigationDrawerFragment = (NavigationDrawerFragment) 
      getSupportFragmentManager().findFragmentById(R.id.navigation_drawer); 
    mTitle = getTitle(); 

    // Set up the drawer. 
    mNavigationDrawerFragment.setUp(
      R.id.navigation_drawer, 
      (DrawerLayout) findViewById(R.id.drawer_layout)); 
} 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     View rootView; 
     switch (getArguments().getInt(ARG_SECTION_NUMBER)) { 
      case 1: 
       rootView = inflater.inflate(R.layout.fragment_myfragment1, container, false); 
       break; 
      case 2: 
       rootView = inflater.inflate(R.layout.fragment_myfragment2, container, false); 
       break; 
      default: 
       rootView = inflater.inflate(R.layout.fragment_myfragment1, container, false); 
     } 
     return rootView; 
    } 
} 

Myfragment1.java

public class Myfragment1 extends Fragment implements View.OnClickListener 
{ 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_myfragment1, container, false); 
    Button add = (Button) view .findViewById(R.id.button_add); 
    add.setOnClickListener(this); 
    return view ; 
} 

@Override 
public void onClick(View v) { 
    switch (v.getId()) { 
     case R.id.button_add: 
      DatabaseActivity d= new DatabaseActivity(); 
      d.newProduct(v); 
      break; 
    } 
} 

}

DatabaseActivity类

public class DatabaseActivity extends ActionBarActivity 
{ 
    EditText productBox; 
    EditText quantityBox; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     productBox = (EditText) findViewById(R.id.productBox); 
     quantityBox = (EditText) findViewById(R.id.quantityBox); 
    } 

    public void newProduct (View view) { 
     MyDBHandler dbHandler = new MyDBHandler(this, null, null, 1); 
     int quantity = Integer.parseInt(quantityBox.getText().toString()); 
     Product product = new Product(productBox.getText().toString(), quantity); 
     dbHandler.addProduct(product); 
     productBox.setText(""); 
     quantityBox.setText(""); 
    } 
} 

Myfragment1.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" 
android:layout_height="match_parent" tools:context="com.test.masterflow1.Myfragment1"> 

<!-- TODO: Update blank fragment layout --> 


<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/delete_string" 
    android:id="@+id/button_remove" 
    android:onClick="removeProduct" 
    android:layout_gravity="right|bottom" /> 

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/find_string" 
    android:id="@+id/button_find" 
    android:onClick="lookupProduct" 
    android:layout_gravity="left|bottom" /> 

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/add_string" 
    android:id="@+id/button_add" 
    android:onClick="newProduct" 
    android:layout_gravity="center_horizontal|bottom" /> 

<EditText 
    android:layout_width="263dp" 
    android:layout_height="wrap_content" 
    android:id="@+id/productBox" 

    android:layout_below="@+id/productID_Box" 
    android:layout_alignParentEnd="true" 
    android:layout_marginTop="72dp" 
    android:layout_alignStart="@+id/productID_Box" 
    android:layout_gravity="right|top" /> 

<EditText 
    android:layout_width="51dp" 
    android:layout_height="76dp" 
    android:id="@+id/quantityBox" 
    android:layout_centerVertical="true" 
    android:layout_alignEnd="@+id/button3" 
    android:layout_toEndOf="@+id/button2" 
    android:layout_gravity="right|center_vertical" /> 

<TextView 
    android:layout_width="64dp" 
    android:layout_height="59dp" 
    android:textAppearance="?android:attr/textAppearanceLarge" 
    android:id="@+id/productID_Box" 
    android:layout_alignWithParentIfMissing="false" 
    android:layout_alignParentEnd="true" 
    android:layout_alignStart="@+id/quantityBox" 
    android:layout_gravity="right|top" /> 

logcat的

22733-22733/? E/AndroidRuntime﹕ FATAL EXCEPTION: main 
java.lang.IllegalStateException: Could not find a method newProduct(View) in the activity class com.test.masterflow1.MainActivity for onClick handler on view class android.support.v7.internal.widget.TintButton with id 'button_add' 
     at android.view.View$1.onClick(View.java:3791) 
     at android.view.View.performClick(View.java:4439) 
     at android.widget.Button.performClick(Button.java:139) 
     at android.view.View$PerformClick.run(View.java:18395) 
     at android.os.Handler.handleCallback(Handler.java:725) 
     at android.os.Handler.dispatchMessage(Handler.java:92) 
     at android.os.Looper.loop(Looper.java:176) 
     at android.app.ActivityThread.main(ActivityThread.java:5317) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:511) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869) 
     at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.NoSuchMethodException: newProduct [class android.view.View] 
     at java.lang.Class.getConstructorOrMethod(Class.java:460) 
     at java.lang.Class.getMethod(Class.java:915) 
     at android.view.View$1.onClick(View.java:3784) 
     at android.view.View.performClick(View.java:4439) 
     at android.widget.Button.performClick(Button.java:139) 
     at android.view.View$PerformClick.run(View.java:18395) 
     at android.os.Handler.handleCallback(Handler.java:725) 
     at android.os.Handler.dispatchMessage(Handler.java:92) 
     at android.os.Looper.loop(Looper.java:176) 
     at android.app.ActivityThread.main(ActivityThread.java:5317) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:511) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869) 
     at dalvik.system.NativeStart.main(Native Method) 

回答

0

您可以指定希望它这里调用方法:

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/add_string" 
    android:id="@+id/button_add" 
    android:onClick="newProduct" <-- this is what it's trying to call 
    android:layout_gravity="center_horizontal|bottom" /> 

注意,错误消息并不在于它不能找到onClick方法,但它在Activity上找不到newProduct方法:

在活动类com.test.masterflow1中找不到方法newProduct(View)。MainActivity

您需要删除从XML的onClick属性,并以您的片段或您的活动设置onClickListener编程无论是。

+0

你能否提供一些参考资料,因为我是初学者,通过阅读各种教程进行学习。不知道如何做到这一点 –

+1

可能这将有助于http://examples.javacodegeeks.com/android/core/view/onclicklistener/android-onclicklistener-example/ –

+0

@adityaNaik我已经尝试过,就像说那里一样通过重写onclick方法,但它不工作 –

0

newProduct()上的Add按钮现在被调用。做了很多更正,所以不知道错误在哪里。密切关注代码,我想你会自己想出来的。

myfragment1.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.test.masterflow1.Myfragment1"> 

    <!-- TODO: Update blank fragment layout --> 

    <Button 
     android:id="@+id/button_remove" <!--Use "@+id/..." for setting IDs --> 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="right|bottom" 
     android:onClick="removeProduct" 
     android:text="Delete" /> 

    <Button 
     android:id="@+id/button_find" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@id/button_remove" <!--And "@id/..." for referring them--> 
     android:layout_gravity="left|bottom" 
     android:onClick="lookupProduct" 
     android:text="Find" /> 

    <Button 
     android:id="@+id/button_add" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@id/button_find" 
     android:layout_gravity="center_horizontal|bottom" 
     android:onClick="newProduct" 
     android:text="Add" /> 

<!-- your other widgets--> 

    </RelativeLayout> 

Myfragment1.java

遵循正确的Java命名约定。请参阅Google's Java style guide

public class Myfragment1 extends Fragment implements View.OnClickListener { 


@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    View view = inflater.inflate(R.layout.myfragment1, container, false); 
    Button add = (Button) view.findViewById(R.id.button_add); 
    add.setOnClickListener(this); 
    return view; 
} 

@Override 
public void onClick(View v) { 
    switch (v.getId()) { 
     case R.id.button_add: 
      DatabaseActivity d = new DatabaseActivity(); 
      d.newProduct(v); 
      break; 
    } 
}} 

MainActivity.java

public class MainActivity extends AppCompatActivity { 
    //Removed the navigation drawer code for simplicity 

     private CharSequence mTitle; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 

      // Do this for adding the fragment programatically. There's also .replace() when you want to replace the added fragment with another fragment. 
getFragmentManager().beginTransaction().add(R.id.framelayout_activity_main, new Myfragment1()).commit(); 
    //There's no onCreateView() lifecycle method in Activities. It belongs in Fragments. Move the code from your onCreateView() appropriately. 

    }} 

activity_main.xml中是这样。

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/framelayout_activity_main" 
android:layout_width="match_parent" 
android:layout_height="match_parent" /> 

DatabaseActivity.java

public class DatabaseActivity extends ActionBarActivity { 

EditText productBox; 
EditText quantityBox; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    productBox = (EditText) findViewById(R.id.productBox); 
    quantityBox = (EditText) findViewById(R.id.quantityBox); 
} 

public void newProduct(View view) { 
    Log.i("DatabaseActivity", "newProduct() Called"); 
    // do the DbHandler stuff here. 

}} 

考虑通过Udacity's Android courses去。它们非常适合初学者。

---- ----编辑

我认为错误可能已经在你的MainActivity#onCreateView()。尝试将该切换块移动到Myfragment1#onCreateView()。 Activity的onCreate()的片段对应onCreateView()。请仔细阅读ActivityFragment的生命周期。