Android Studio PageViewer findViewById (R.Id.FragmentIteam) возвращает ноль - PullRequest
1 голос
/ 05 марта 2020

Я получил PageViewer с 3 фрагментами (Домой, Регистрация, Логин). Я хочу получить текст из EditText фрагмента входа. Если я вызываю findViewById, он каждый раз возвращает null. Так что я не так делаю? MyPageViewer. java:

public class MyViewPager extends ViewPager {

    public MyViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        initMyScroller();
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        // Never allow swiping to switch between pages
        return false;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // Never allow swiping to switch between pages
        return false;
    }

    private void initMyScroller() {
        try {
            Class<?> viewpager = ViewPager.class;
            Field scroller = viewpager.getDeclaredField("mScroller");
            scroller.setAccessible(true);
            scroller.set(this, new MyScroller(getContext()));
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public class MyScroller extends Scroller {
        public MyScroller(Context context) {
            //super(context, new LinearInterpolator()); // my LinearInterpolator
            super(context, new DecelerateInterpolator());
        }

        @Override
        public void startScroll(int startX, int startY, int dx, int dy, int duration) {
            super.startScroll(startX, startY, dx, dy, duration);
        }
    }




}

LoginFragment. java:

import android.os.Bundle;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

import androidx.fragment.app.Fragment;


public class LoginFragment extends Fragment {


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

    public static LoginFragment newInstance(){
        LoginFragment frag = new LoginFragment();
        return frag;
    }


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



    }

}

frag_login. xml:

<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"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:gravity="center"
    android:focusable="true"
    android:focusableInTouchMode="true">



    <LinearLayout

        android:layout_width="280dp"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:gravity="center"
        android:layout_centerInParent="true">



            <EditText
                android:id="@+id/edt_login"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="Username / Email"

                android:imeOptions="actionNext"
                android:inputType="textEmailAddress"
                android:drawableLeft="@drawable/ic_user"
                android:drawablePadding="15dp"/>


            <EditText
                android:id="@+id/edt_pw"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="Passwort"


                android:imeOptions="actionDone"
                android:inputType="textPassword"
                android:drawableLeft="@drawable/ic_lock"
                android:drawablePadding="15dp"/>

        <com.ornach.nobobutton.NoboButton

            android:id="@+id/btn_login"
            android:layout_width="130dp"
            android:layout_height="wrap_content"
            android:layout_marginTop="30dp"
            android:padding="10dp"
            android:onClick="GoToMenu"
            app:nb_backgroundColor="@android:color/transparent"
            app:nb_borderColor="#666"
            app:nb_borderWidth="1dp"
            app:nb_focusColor="#DDD"
            app:nb_text="ANMELDEN"
            app:nb_textSize="14sp" />

    </LinearLayout>

</LinearLayout>

MainActivity. java :

public class MainActivity extends AppCompatActivity {
    private final int TOTAL_PAGE=3;

    private int sHeight;
    private int sWidth;

    View navBackground, navBottom;
    View navHome, navLogin, navRegister;
    EditText edt_pw, edt_login;
    ViewPager mViewPager;
    private SectionsPagerAdapter mSectionsPagerAdapter;

    public static byte[] getSHA(String input) throws NoSuchAlgorithmException
    {

        MessageDigest md = MessageDigest.getInstance("SHA-256");
        return md.digest(input.getBytes(StandardCharsets.UTF_8));
    }

    public static String toHexString(byte[] hash)
    {

        BigInteger number = new BigInteger(1, hash);
        StringBuilder hexString = new StringBuilder(number.toString(16));
        while (hexString.length() < 32)
        {
            hexString.insert(0, '0');
        }

        return hexString.toString();
    }

    protected void onCreate( Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_startup);
        SharedPreferences pref = this.getSharedPreferences("SystemSettings", 0); // 0 - for private mode
        SharedPreferences.Editor editor = pref.edit();


        if ((pref.getInt("avi", 0)) == 0) {
           editor.putInt("avi", 1);
            editor.commit();

            Intent intent = new Intent(this, instruction.class);
            startActivity(intent);
        }

        screenMeasurement();


        navBackground = findViewById(R.id.img_nav_bg);
        navBottom = findViewById(R.id.navbottom);
        navHome = findViewById(R.id.nav_home);
        navLogin = findViewById(R.id.nav_login);
        navRegister = findViewById(R.id.nav_register);
        mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
        mViewPager = (ViewPager) findViewById(R.id.viewPager);
        mViewPager.setAdapter(mSectionsPagerAdapter);
        mViewPager.setCurrentItem(1);

        mSectionsPagerAdapter.getItem(2);








        navBackground.post(new Runnable() {
            @Override
            public void run() {
                int w = (int) (sWidth*2.5);
                int h =  w/2;
                FrameLayout.LayoutParams bgParams = (FrameLayout.LayoutParams) navBackground.getLayoutParams();
                bgParams.width = w;
                bgParams.height = h;
                //bgParams.leftMargin =  -1*((w/2)-(sWidth/2));
                bgParams.bottomMargin = (int) (-1*(h/2.5));
                navBackground.requestLayout();


                int left = (sWidth/2) - (w/2);
                navBackground.setX(left);

                resizeNavIcon(navHome,w);
                resizeNavIcon(navLogin,w);
                resizeNavIcon(navRegister,w);

            }
        });

    }

    private void resizeNavIcon(View view, int bgWidth){
        int iconWidth = (bgWidth*43)/500;
        int m = iconWidth/15;
        LinearLayout.LayoutParams btnParams = (LinearLayout.LayoutParams) view.getLayoutParams();
        btnParams.width = iconWidth;
        btnParams.height = iconWidth;
        btnParams.leftMargin = (int) (m*1.5);
        btnParams.rightMargin = (int) (m*1.5);
        btnParams.topMargin = m;
        btnParams.bottomMargin = m;
        view.setLayoutParams(btnParams);
        view.requestLayout();

        int p = (int) (iconWidth/3.5);
        //Log.e("TAG","width: "+iconWidth+"  Padding: "+ p);
        view.setPadding(p,p,p,p);
    }

    private void screenMeasurement(){
        DisplayMetrics displayMetrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        sHeight = displayMetrics.heightPixels;
        sWidth = displayMetrics.widthPixels;
    }



    public void onNavClick(View view){
        moveBackground(view);

        int d = Integer.parseInt(view.getTag().toString());
        mViewPager.setCurrentItem(d);
    }


    private void moveBackground(View view){
        int c = view.getLeft()+(view.getWidth()/2);

        int left = c-(navBackground.getWidth()/2);
        //navBackground.setX(left);
        navBackground.animate().translationX(left);
    }

    public void GoToMenu(View view) {

        edt_login = findViewById(R.id.edt_login);
        edt_pw = findViewById(R.id.edt_pw);




        Log.d("Test","PW: "+edt_pw.getText().toString());



    }


    public class SectionsPagerAdapter extends FragmentPagerAdapter {

        public SectionsPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            switch (position){
                case 0:
                    return RegisterFragment.newInstance();
                case 2:
                    return LoginFragment.newInstance();
                default:
                    return HomeFragment.newInstance();
            }


        }

        @Override
        public int getCount() {
            return TOTAL_PAGE;
        }

    }

}

activity_startup. xml:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    >



    <ImageView
        android:id="@+id/img_nav_bg"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:src="@drawable/nav_background"
        android:layout_gravity="bottom"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <e.marco.gymdiary.MyViewPager
            android:id="@+id/viewPager"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"/>
        <LinearLayout
            android:id="@+id/navbottom"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:orientation="horizontal"
            android:layout_gravity="bottom"
            >

            <com.ornach.magicicon.IconButton
                android:id="@+id/nav_login"
                android:layout_width="60dp"
                android:layout_height="60dp"
                android:onClick="onNavClick"
                android:padding="0dp"
                app:mi_fontText="&#xf234;"
                app:mi_iconColor="#FFF"
                app:mi_typeface="font_awesome"
                android:tag="0"
                app:mi_shape="oval"/>

            <com.ornach.magicicon.IconButton
                android:id="@+id/nav_home"
                android:layout_width="60dp"
                android:layout_height="60dp"
                android:onClick="onNavClick"
                android:padding="0dp"
                app:mi_fontText="&#xf015;"
                app:mi_iconColor="#FFF"
                app:mi_typeface="font_awesome"
                android:tag="1"
                app:mi_shape="oval"/>

            <com.ornach.magicicon.IconButton
                android:id="@+id/nav_register"
                android:layout_width="60dp"
                android:layout_height="60dp"
                android:onClick="onNavClick"
                android:padding="0dp"
                app:mi_fontText="&#xf007;"
                app:mi_iconColor="#FFF"
                app:mi_typeface="font_awesome"
                android:tag="2"
                app:mi_shape="oval"/>
        </LinearLayout>
    </LinearLayout>

</FrameLayout>

Строка edt_pw.getText().toString() ничего не возвращает. Пожалуйста, объясните это точно. Спасибо.

BR Марко

Ответы [ 2 ]

2 голосов
/ 05 марта 2020

«Вы должны проектировать каждый фрагмент как модульный и многократно используемый компонент деятельности». взято из https://developer.android.com/guide/components/fragments

В настоящее время ваш фрагмент логина не является модульным, он зависит от MainActivity. java для предоставления метода onClick GoToMenu

Хотя LoginFragment будет существовать при нажатии кнопки GoToMenu (поскольку кнопка находится внутри фрагмента), область действия

edt_login = findViewById(R.id.edt_login);
edt_pw = findViewById(R.id.edt_pw);

В MainActivity. java неверна

Лучшим методом является обработка нажатия кнопки внутри самого фрагмента с сохранением модульности.

Для этого необходимо удалить android:onClick="GoToMenu" из файла fragment_login.xml.

В LoginFragment.java set OnClickListener для кнопки

onCreateView в LoginFragment.java будет выглядеть так: -

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        final View rootView = inflater.inflate(R.layout.fragment_login, container, false);

Button gotoMenuButton = (Button) rootView.findViewById(R.id.btn_login);
gotoMenuButton.setOnClickListener( new View.OnClickListener() {
            @Override
            public void onClick(View v) {
              EditText edt_login = rootView.findViewById(R.id.edt_login);
              EditText edt_pw = rootView.findViewById(R.id.edt_pw);
            }
         };
   return rootView;
}

Затем, в зависимости от того, что вы хотите сделать с этими значениями, вам может потребоваться создать интерфейс для передачи этих данных из фрагмента.

0 голосов
/ 05 марта 2020

Согласно вашему коду edt_pw определено в frag_login. xml, и вы получаете доступ к edt_pw в MainActivity. java, который обязательно вернет ноль , вам нужно инициализировать, что в LoginFragment

Я могу сделать одно из следующих :

  1. Сохраните экземпляр LoginFragment и получите доступ edt_pw (хороший подход)
  2. Создайте прослушиватель интерфейса и передайте прослушиватель LoginFragment и передать значение edt_pw в MainActivity
...