java - एक्टिविटी के अंदर एक फ्रैगमेंट के टेक्स्ट व्यू तक एक त्रुटि क्यों पहुंच रही है




android android-fragments (3)

आपको FragOne से FragOne का एक ही उदाहरण प्राप्त करने की आवश्यकता है।

सबसे पहले, आप केवल ViewPager सेटअप होने के बाद FragOne उदाहरण तक पहुँच सकते हैं।
फिर, यह प्रयास करें:

fo = adapter.getItem(0)

ध्यान दें:
चूँकि आपके पास पहले से ही टुकड़े हैं, इसलिए बेहतर होगा कि खंड गतिविधि के बजाय UI से संबंधित क्रियाओं (जैसे कि टेक्स्टव्यू सेट करना) को संभालें।

MainActivity वर्ग:

/* all necessary imports */

public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {

    /* Other variable initialized here... */
    FragOne fo;

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

        fo.setTextViewText("This is added from Activity");

        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);

        viewPager = (ViewPager) findViewById(R.id.viewpager);
        setupViewPager(viewPager);

        tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(viewPager);
    }


    private void setupViewPager(ViewPager viewPager) {
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
        adapter.addFragment(new FragOne(), "My Tracker");
        adapter.addFragment(new FragTwo(), "Team Tracker");
        viewPager.setAdapter(adapter);
    }

    class ViewPagerAdapter extends FragmentPagerAdapter {
        private final List<Fragment> mFragmentList = new ArrayList<>();
        private final List<String> mFragmentTitleList = new ArrayList<>();

        public ViewPagerAdapter(FragmentManager manager) {
            super(manager);
        }

        @Override
        public Fragment getItem(int position) {
            return mFragmentList.get(position);
        }

        @Override
        public int getCount() {
            return mFragmentList.size();
        }

        public void addFragment(Fragment fragment, String title) {
            mFragmentList.add(fragment);
            mFragmentTitleList.add(title);
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return mFragmentTitleList.get(position);
        }
    }

    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }

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

        if (id == R.id.nav_manage) {

        } else if (id == R.id.nav_share) {

        } else if (id == R.id.nav_send) {

        }

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

Fragment क्लास:

/* all necessary imports */
public class FragOne extends Fragment {

    TextView tvCName;

    public FragOne() {
        // 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.fragment_frag_one, container, false);

        return view;
        //return inflater.inflate(R.layout.fragment_frag_one, container, false);
    }

    @Override
    public void onViewCreated(View view , Bundle savedInstanceState) {
        tvCName = (TextView) view.findViewById(R.id.tvctq);
    }

    public void setTextViewText(String value){
        tvCName.setText(value);
    }

}

Fragment 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.mytip.FragOne">

        <TextView
            android:text="TextView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/tvctq" />
</FrameLayout>

मैं इस तरह से MainActivity से Fragment अंदर MainActivity का उपयोग करने की कोशिश कर रहा हूं:

FragOne fo;
fo.setTextViewText("This is added from Activity");

मैं एक NullPointerExceptionError प्राप्त करता रहता हूं। मैंने सभी लेखों को देखा कि कैसे पहुंचें, हालांकि उनमें से किसी ने भी मेरी मदद नहीं की।

क्या कोई मुझे बता सकता है कि मैं क्या गलत कर रहा हूं और इसे कैसे ठीक करूं?

मैं अपने Fragment अंदर अन्य View एस को जोड़ने की भी योजना बना रहा हूं जिसे मुझे भविष्य में उपयोग करने की आवश्यकता होगी।


आपको अपनी गतिविधि में अपने फ्रेग्मेंट को बनाते समय अपने फ्रेगमेंट कारखाने के तरीके का उपयोग करने की आवश्यकता है। कृपया नीचे देखे:

**

वापस ढेर

**

लेन-देन जिसमें टुकड़े संशोधित होते हैं, उसे मालिक की गतिविधि के आंतरिक बैक-स्टैक पर रखा जा सकता है। जब उपयोगकर्ता गतिविधि में वापस आता है, तो गतिविधि समाप्त होने से पहले बैक स्टैक पर कोई भी लेन-देन बंद हो जाता है।

उदाहरण के लिए, इस सरल टुकड़े पर विचार करें जो एक पूर्णांक तर्क के साथ त्वरित है और यह दिखाता है कि इसके UI में एक TextView में:

public static class CountingFragment extends Fragment {
int mNum;

/**
 * Create a new instance of CountingFragment, providing "num"
 * as an argument.
 */
static CountingFragment newInstance(int num) {
    CountingFragment f = new CountingFragment();

    // Supply num input as an argument.
    Bundle args = new Bundle();
    args.putInt("num", num);
    f.setArguments(args);

    return f;
}

/**
 * When creating, retrieve this instance's number from its arguments.
 */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mNum = getArguments() != null ? getArguments().getInt("num") : 1;
}

/**
 * The Fragment's UI is just a simple text view showing its
 * instance number.
 */
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.hello_world, container, false);
    View tv = v.findViewById(R.id.text);
    ((TextView)tv).setText("Fragment #" + mNum);
    tv.setBackgroundDrawable(getResources().getDrawable(android.R.drawable.gallery_thumb));
    return v;
}
}

एक फ़ंक्शन जो टुकड़े का एक नया उदाहरण बनाता है, जो भी वर्तमान खंड उदाहरण दिखाया जा रहा है और उस बदलाव को पीछे के स्टैक पर धकेलने के रूप में लिखा जा सकता है:

void addFragmentToStack() {
mStackLevel++;

// Instantiate a new fragment.
Fragment newFragment = CountingFragment.newInstance(mStackLevel);

// Add the fragment to the activity, pushing this transaction
// on to the back stack.
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.simple_fragment, newFragment);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.addToBackStack(null);
ft.commit();
}

इस फ़ंक्शन के लिए प्रत्येक कॉल के बाद, एक नई प्रविष्टि स्टैक पर है, और वापस दबाकर इसे उपयोगकर्ता को उस स्थिति में वापस करने के लिए पॉप करेगा जो पिछली स्थिति में यूआई में था।

स्रोत: https://developer.android.com/reference/android/app/Fragment.html


क्योंकि निम्नलिखित कोड स्निपेट के लिए आरंभिक नहीं किया गया है:

FragOne fo;

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

    fo.setTextViewText("This is added from Activity");
    ...
}

fo.setTextViewText() यथोचित रूप से NPE फेंकता है।







textview