Метод onClick не найден

1

Я новичок в этом, и я делаю приложение для университетского проекта, и я хотел добавить VideoView в свое приложение, поэтому я посмотрел это видео (" https://www.youtube.com/watch?v=SrPHLj_q_OQ&t = 421s ") и сделал это и работал. Но затем я добавляю, чтобы скопировать код из content_main.xml во фрагмент, и он перестал работать и выдает ошибку "android: onClick" на кнопке. И когда я нажимаю CTRL + F1, чтобы проверить это говорит это:

"Corresponding method handler'public void videoplay(android.view.View)' not found
Inspection info:The onClick attribute value should be the name of a method in this View context to invoke when the view is clicked.This name must correspond to a public method that takes exactly one parameter of type View.

Must be a string value, using '\;' to escape characters such as '\n' or '\uxxxx' for a unicode character.

Issue id:OnClick "

Вот мой xml:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout 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"
    android:paddingBottom="16dp"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:paddingTop="16dp"
    android:background="#003e6f"
    android:orientation="vertical"
    tools:context=".InicioFragment">


    <VideoView
        android:id="@+id/videoView"
        android:layout_width="match_parent"
        android:layout_gravity="center_horizontal"
        android:layout_height="197dp" />

    <Button
        android:id="@+id/button2"
        style="@style/Widget.AppCompat.Button.Borderless"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:background="#FF6600"
        android:text="Play"
        android:onClick="videoplay"
        android:textColor="#ffffff" />

    <ImageView
        android:id="@+id/imagem2"
        android:layout_width="match_parent"
        android:layout_height="360dp"
        android:layout_alignParentBottom="true"
        android:adjustViewBounds="false"
        android:background="@drawable/tech3" />

</LinearLayout>

Вот моя ява:

package intro.android.migueloliveiraapp;

import android.net.Uri;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.view.View;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.Toast;
import android.widget.VideoView;


public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        clk = (Button) findViewById(R.id.button2);
        videov = (VideoView) findViewById(R.id.videoView);



        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.addDrawerListener(toggle);
        toggle.syncState();

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);

        //Carregar o layout do fragent incial "InicioFragment"
        InicioFragment inicioFragment = new InicioFragment();
        FragmentManager manager = getSupportFragmentManager();
        manager.beginTransaction()
                .replace(R.id.relative_layout_para_o_fragment, inicioFragment, inicioFragment.getTag())
                .commit();


    }



    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();

        if (id == R.id.nav_oliveira) {
            Quem_Oliveira quem_oliveiraFragment = new Quem_Oliveira();
            FragmentManager manager = getSupportFragmentManager();
            manager.beginTransaction()
                    .replace(R.id.relative_layout_para_o_fragment,
                            quem_oliveiraFragment, quem_oliveiraFragment.getTag())
                    .commit();
            Toast.makeText(this, "Oliveira", Toast.LENGTH_SHORT).show();
        } else if (id == R.id.nav_profissao) {
            Profissao profissaoFragment = new Profissao();
            FragmentManager manager = getSupportFragmentManager();
            manager.beginTransaction()
                    .replace(R.id.relative_layout_para_o_fragment,
                            profissaoFragment, profissaoFragment.getTag())
                    .commit();
            Toast.makeText(this, "Profissão", Toast.LENGTH_SHORT).show();
        } else if (id == R.id.nav_feitos) {
            Principais_feitos principais_feitosFragment = new Principais_feitos();
            FragmentManager manager = getSupportFragmentManager();
            manager.beginTransaction()
                    .replace(R.id.relative_layout_para_o_fragment,
                            principais_feitosFragment, principais_feitosFragment.getTag())
                    .commit();
            Toast.makeText(this, "Principais Feitos", Toast.LENGTH_SHORT).show();
        } else if (id == R.id.nav_academicas) {
            Habilitacoes_Academicas habilitacoes_academicasFragment = new Habilitacoes_Academicas();
            FragmentManager manager = getSupportFragmentManager();
            manager.beginTransaction()
                    .replace(R.id.relative_layout_para_o_fragment,
                            habilitacoes_academicasFragment, habilitacoes_academicasFragment.getTag())
                    .commit();
            Toast.makeText(this, "Habilitações Académicas", Toast.LENGTH_SHORT).show();
        } else if (id == R.id.nav_galeria) {
            Galeria galeriaFragment = new Galeria();
            FragmentManager manager = getSupportFragmentManager();
            manager.beginTransaction()
                    .replace(R.id.relative_layout_para_o_fragment,
                            galeriaFragment, galeriaFragment.getTag())
                    .commit();
            Toast.makeText(this, "Galeria", Toast.LENGTH_SHORT).show();
        } else if (id == R.id.nav_contactos) {
            Contactos contactosFragment = new Contactos();
            FragmentManager manager = getSupportFragmentManager();
            manager.beginTransaction()
                    .replace(R.id.relative_layout_para_o_fragment,
                            contactosFragment, contactosFragment.getTag())
                    .commit();
            Toast.makeText(this, "Contactos", Toast.LENGTH_SHORT).show();

        }

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }

    //video view
    Button clk;
    VideoView videov;

    public void videoplay(View v){
        String videopath = "android.resource://intro.android.migueloliveiraapp/" + R.raw.oliveira;
        Uri uri = Uri.parse(videopath);
        videov.setVideoURI(uri);
        videov.start();
    }


}

Вот мой InicioFragment Java:

package intro.android.migueloliveiraapp;


import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;


/**
 * A simple {@link Fragment} subclass.
 */
public class InicioFragment extends Fragment {


    public InicioFragment() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_inicio, container, false);
    }

}

вот мой обновленный InicioFragment.java:

package intro.android.migueloliveiraapp;


import android.os.Bundle;
import android.support.design.widget.NavigationView;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.net.Uri;
import android.widget.Button;
import android.widget.VideoView;



/**
 * A simple {@link Fragment} subclass.
 */
public class InicioFragment extends Fragment {


    public InicioFragment() {
        // Required empty public constructor
    }



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

        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_inicio, container, false);
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        clk = (Button) view.findViewById(R.id.button);
        videov = (VideoView) view.findViewById(R.id.videoView);

        // bind the views here.
        Button button2 = view.findViewById(R.id.button);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // do something here.

            }
        });
    }

    Button clk;
    VideoView videov;


    public void videoplay(View v){
        String videopath = "android.resource://intro.android.migueloliveiraapp/" + R.raw.oliveira;
        Uri uri = Uri.parse(videopath);
        videov.setVideoURI(uri);
        videov.start();
    }



}
Теги:
android-studio
android-layout

5 ответов

0

Следующая ошибка:

"Corresponding method handler'public void videoplay(android.view.View)' not found
Inspection info:The onClick attribute value should be the name of a method in this View context to invoke when the view is clicked.This name must correspond to a public method that takes exactly one parameter of type View.

Must be a string value, using '\;' to escape characters such as '\n' or '\uxxxx' for a unicode character.

Issue id:OnClick "

означает, что вы забыли добавить соответствующий метод в свой класс Activity при использовании атрибута android:onClick="videoplay". Итак, вам нужно добавить следующий метод в вашу деятельность:

public void videoplay(View v){
  // do something here.
}

Самая важная часть - это android:onClick тег android:onClick работает только тогда, когда вы используете его внутри макета содержимого Activity. , Итак, android:onClick не работает, когда вы используете его внутри макета фрагмента. Вам нужно использовать onClickListener вместо этого.

Вам нужно связать представление и добавить onClickListener примерно так:

public class InicioFragment extends Fragment {

    public InicioFragment() {}

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_inicio, container, false);
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        // bind the views here.
        Button button2 = view.findViewById(R.id.button2);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               // do something here.
            }
        });
    }
}
0

Это потому, что вы создали videoplay() внутри вашего MainActivity.java. Вы должны поместить свой videoplay() в InicioFragment.java поскольку это соответствующий файл для макета xml вы упомянули выше.

Инициализируйте ваши переменные, как onCreateView ниже, внутри вашего метода onCreateView в InicioFragment

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_inicio, container, false);

        Button btn1 = view.findViewById(R.id.button_id);
        .....
             .....

        return view;
    }

    public void videoplay(View v){
          .........
          .....
    }

  • 0
    Я обновил вопрос с моим InicioFragment Java. Если бы вы могли попробовать поместить этот метод туда, потому что он выдает ошибку «findViewById», когда я копирую его из MainActivity в InicioFragment.
  • 0
    Я обновил свой ответ, как я уже говорил.
0

Обратите внимание на ваш XML файл, что этот контекст файла является вашим InicioFragment (tools: context = ". InicioFragment"). Следовательно, видеоплей (View v) должен быть внутри вашего класса InicioFragment. Вот почему причина не найдена. Он не будет искать на вашей MainActivity.

public class InicioFragment extends Fragment {


    public InicioFragment() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.testclassfragment, container, false);
        Button clk = (Button) view.findViewById(R.id.button);
        VideoView videov = (VideoView) view.findViewById(R.id.videoView);
        return view;
    }

    public void videoplay(View v){
        String videopath = "android.resource://intro.android.migueloliveiraapp/" + R.raw.oliveira;
        Uri uri = Uri.parse(videopath);
        videov.setVideoURI(uri);
        videov.start();
    }
}

Поскольку у вас также есть переменная для вашей кнопки, нужно сделать еще один вариант:

clk.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               Log.d("TESTING", "Clicked");
            }
        });
  • 0
    Я обновил вопрос с моим InicioFragment Java. Если бы вы могли попробовать поместить этот метод туда, потому что он выдает ошибку «findViewById», когда я копирую его из MainActivity в InicioFragment.
  • 0
    на моей MainActivity у меня есть "clk = (кнопка) findViewById (R.id.button); videov = (VideoView) findViewById (R.id.videoView);" внутри "protected void onCreate (Bundle saveInstanceState)", не нужно ли мне также поместить его в InicioFragment? и когда я пытаюсь поставить его, это дает мне ошибку, о которой я говорил на "findViewByid"
Показать ещё 2 комментария
0

Вы можете использовать это для клика.

Button mPlayVideo;

//В процессе создания

mPlayVideo = findViewById(R.id.button2);
mPlayVideo.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, "Clicked", Toast.LENGTH_SHORT).show();
            }
        });
0

В вашем xml ваши tools:context=".InicioFragment относится к вашему фрагменту, а не к вашей деятельности.

Ваш метод находится внутри действия, а не в классе фрагмента, и именно поэтому вы получаете эту ошибку.

Вы можете проверить Вызов метода активности из фрагмента.

Но я могу рекомендовать использовать атрибут onClick внутри вашей деятельности, а внутри фрагмента использовать обычный прослушиватель кликов:

View view =  findViewById(R.id.viewId);
view .setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
    //do something
  }
});

Ещё вопросы

Сообщество Overcoder
Наверх
Меню