如何从其他活动中调用碎片活动的方法

时间:2015-12-06 13:23:55

标签: android android-fragments

我的应用程序有片段活动,它被称为“InvOne.Java”。这个活动有两个公共方法。例如“setTextTo(String text);”和“displayListView()”。我需要从InvoBill.Java活动中调用这些方法。我已经在InvoBill.Java文件中使用了下面的代码。但它对我不起作用。 Logcat显示Error: Attempt to invoke virtual method 'void com.example.dilanka.ypbrothers.InvOne.displayListView()' on a null object reference错误。

FragmentManager fm = getSupportFragmentManager();
InvOne fragment = (InvOne)fm.findFragmentByTag("fragment_invone");
fragment.setTextTo("Test Method");
fragment.displayListView();

这是两种方法:

public void setTextTo(String text)
{
    myTextView.setText(text);
}

public void displayListView(){
    try{
        cursor = dbHelper.fetchInvoItemById(Invoice._id_in);
        columns = new String[] {
                DbAdapter.InvoItm_COL_5,
                DbAdapter.InvoItm_COL_6,
                DbAdapter.InvoItm_COL_7,
                DbAdapter.InvoItm_COL_7,
        };
        to = new int[] {
                R.id.InvItm_qty,
                R.id.InvItm_rate,
                R.id.InvItm_amount,
                R.id.InvItm_des,
        };
        dataAdapter = new SimpleCursorAdapter(
                getContext(), R.layout.row_inv_itm,
                cursor,
                columns,
                to,
                0);

        listView = (ListView)v.findViewById(R.id.lViewFragInvOne);
        listView.setAdapter(dataAdapter);

        listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
                return true;
            }
        });
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

            }
        });
    }
    catch (Exception e){
        Log.v("Error ", e.getMessage());
    }
}

这是InvoBill.Java

public class InvoBill extends AppCompatActivity {

    private DbAdapter dbHelper;
    View item_to_invo;
    AlertDialog ad;
    String ItmId,_qoh,_sale,_cost;
    private SimpleCursorAdapter dataAdapter;
    AutoCompleteTextView acTextView;
    private Toolbar toolbar;
    private TabLayout tabLayout;
    private ViewPager viewPager;
    private int[] tabIcons = {
            R.drawable.customer,
            R.drawable.report,
            R.drawable.invoice
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_invo_bill);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        setTitle("INVOICE#" + Invoice._id_in);

        dbHelper = new DbAdapter(this);
        dbHelper.open();

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                try {
                    AddItmToInvo();
                }
                catch (Exception e){
                    Log.e("Error", e.getMessage());
                }
            }
        });
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

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

        tabLayout = (TabLayout) findViewById(R.id.tabs_cus);
        tabLayout.setupWithViewPager(viewPager);
        //setupTabIcons();
    }

    private void setupTabIcons() {
        tabLayout.getTabAt(0).setIcon(tabIcons[0]);
        tabLayout.getTabAt(1).setIcon(tabIcons[1]);
        tabLayout.getTabAt(2).setIcon(tabIcons[2]);
    }

    private void setupViewPager(ViewPager viewPager) {
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
        adapter.addFragment(new InvOne(), "Items");
        adapter.addFragment(new InvTwo(), "Sales");
        adapter.addFragment(new InvThree(), "Payments");
        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);
        }
    }

    public void AddItmToInvo(){
        final LayoutInflater inflater = getLayoutInflater();
        View myView = inflater.inflate(R.layout.add_itm_to_invo_heder, null);
        ImageButton save, close;
        save = (ImageButton)myView.findViewById(R.id.btn_itm_invo_save);
        close = (ImageButton)myView.findViewById(R.id.btn_itm_invo_close);

        AlertDialog.Builder alt = new AlertDialog.Builder(this);
        alt.setCustomTitle(myView);
        alt.setView(R.layout.item_to_invo);
        ad = alt.show();

        final int[] to = new int[] { android.R.id.text1 };
        final String[] from = new String[] { "_name" };

        acTextView = (AutoCompleteTextView)ad.findViewById(R.id.acTextView2);
        SimpleCursorAdapter adapter = new SimpleCursorAdapter(
                this,
                android.R.layout.simple_dropdown_item_1line,
                null,
                from,
                to);
        acTextView.setAdapter(adapter);
        acTextView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Cursor cursor = (Cursor) parent.getItemAtPosition(position);
                ItmId = cursor.getString(cursor.getColumnIndexOrThrow("_id"));
                _qoh = cursor.getString(cursor.getColumnIndexOrThrow("_qoh"));
                _sale = (cursor.getString(cursor.getColumnIndexOrThrow("_sale")));
                _cost = (cursor.getString(cursor.getColumnIndexOrThrow("_cost")));

                if (!(_qoh.isEmpty())) {
                    ((EditText) ad.findViewById(R.id._qoh_invAdd)).
                            setText(_qoh);
                }
                if (!(_sale.isEmpty())) {
                    ((EditText) ad.findViewById(R.id._sale_invAdd)).
                            setText(_sale);
                }
            }
        });
        adapter.setCursorToStringConverter(new SimpleCursorAdapter.CursorToStringConverter() {
            @Override
            public CharSequence convertToString(Cursor cursor) {
                final int columnIndex = cursor.getColumnIndexOrThrow("_name");
                final String str = cursor.getString(columnIndex);
                return str;
            }
        });
        adapter.setFilterQueryProvider(new FilterQueryProvider() {
            @Override
            public Cursor runQuery(CharSequence constraint) {
                return dbHelper.fetchCountriesByName((constraint != null ? constraint.toString() : null));
            }
        });
        save.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    EditText qty, rate;
                    qty = (EditText) ad.findViewById(R.id._qoh_invAdd);
                    rate = (EditText) ad.findViewById(R.id._sale_invAdd);

                    dbHelper.AddUpInvItm(Invoice._id_in, ItmId, qty.getText().toString(), rate.getText().
                            toString(), String.valueOf(Float.valueOf(qty.getText().toString()) *
                            Float.valueOf(rate.getText().toString())), String.valueOf(Float.
                            valueOf(qty.getText().toString()) * Float.valueOf(_cost)));
                    dbHelper.AdjustQoh(ItmId, String.valueOf(Float.valueOf(_qoh)
                            - Float.valueOf(qty.getText().toString())));

                    //I need call two method of fragment from here.
                    try{
                        FragmentManager fm = getSupportFragmentManager();
                        InvOne fragment = (InvOne)fm.findFragmentByTag("fragment_invone");
                        fragment.setTextTo("Test Method");
                        fragment.displayListView();
                    }
                    catch (Exception e){
                        Log.e("Error ", e.getMessage());
                    }
                    ad.dismiss();
                } catch (Exception e) {
                    Log.e("Error", e.getMessage());
                }
            }
        });
        close.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ad.dismiss();
            }
        });
    }

    private void goToActivity(Class<InvOne> activityClass,String text)
    {
        Intent newActivity24=new Intent(this,activityClass);
        newActivity24.putExtra("key",text);
        startActivity(newActivity24);
    }

}

这是InvOne.Java

public class InvOne extends Fragment{

String[] columns;
int[] to;
View v;
Cursor cursor;
ListView listView;
TextView myTextView;
private DbAdapter dbHelper;
private SimpleCursorAdapter dataAdapter;

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

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    dbHelper = new DbAdapter(getContext());
    dbHelper.open();

}

@Override
public View onCreateView(LayoutInflater inflat, ViewGroup container,
                          Bundle savedInstanceState) {
    v = inflat.inflate(R.layout.fragment_invone, container, false);

    myTextView = (TextView)v.findViewById(R.id.InOneFrag_amount);
    myTextView.setText("123");

    displayListView();
    return v;
}

public void setTextTo(String text)
{
    myTextView.setText(text);
}

public void displayListView(){
    try{
        cursor = dbHelper.fetchInvoItemById(Invoice._id_in);
        columns = new String[] {
                DbAdapter.InvoItm_COL_5,
                DbAdapter.InvoItm_COL_6,
                DbAdapter.InvoItm_COL_7,
                DbAdapter.InvoItm_COL_7,
        };
        to = new int[] {
                R.id.InvItm_qty,
                R.id.InvItm_rate,
                R.id.InvItm_amount,
                R.id.InvItm_des,
        };
        dataAdapter = new SimpleCursorAdapter(
                getContext(), R.layout.row_inv_itm,
                cursor,
                columns,
                to,
                0);

        listView = (ListView)v.findViewById(R.id.lViewFragInvOne);
        listView.setAdapter(dataAdapter);

        listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
                return true;
            }
        });
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

            }
        });
    }
    catch (Exception e){
        Log.v("Error ", e.getMessage());
    }
}

}

1 个答案:

答案 0 :(得分:0)

  

假设我有一个活动Tab1.java,我想从片段ViewFragment.java访问Tab1的sendRequest()方法,我只需创建一个像Tab1 tab1这样的对象;并说tab1.sendRequest();在我的ViewFragment.java的onCreateView()方法中

相关问题