検索

ホームページ  >  に質問  >  本文

android - 求问Fragment fragment = (Fragment) page.getCls().newInstance();

这段代码是什么意思?里面的newInstance()的作用是什么?

这个是别人的代码:

 protected void initFromIntent(int pageValue, Intent data) {
        if (data == null) {
            throw new RuntimeException(
                    "you must provide a page info to display");
        }
        SimpleBackPage page = SimpleBackPage.getPageByValue(pageValue);
        if (page == null) {
            throw new IllegalArgumentException("can not find page by value:"
                    + pageValue);
        }

        setActionBarTitle(page.getTitle());

        try {
            /**
             *获得一个Fragment
             */
            Fragment fragment = (Fragment) page.getClz().newInstance();

            Bundle args = data.getBundleExtra(BUNDLE_KEY_ARGS);
            if (args != null) {
                fragment.setArguments(args);
            }

            FragmentTransaction trans = getSupportFragmentManager()
                    .beginTransaction();
            trans.replace(R.id.container, fragment, TAG);
            trans.commitAllowingStateLoss();

            mFragment = new WeakReference<Fragment>(fragment);
        } catch (Exception e) {
            e.printStackTrace();
            throw new IllegalArgumentException(
                    "generate fragment error. by value:" + pageValue);
        }
    }

通过调用getPageByValue()获得page

public enum SimpleBackPage {

    FEEDBACK(1, R.string.setting_about, FeedBackFragment.class),
    ABOUT(2, R.string.setting_about, AboutFrament.class);


    private int values;
    private int title;
    private Class<?> cls;

    private SimpleBackPage(int values, int title, Class<?> cls) {
        this.values = values;
        this.title = title;
        this.cls = cls;
    }

    public int getValues() {
        return values;
    }

    public void setValues(int values) {
        this.values = values;
    }

    public Class<?> getCls() {
        return cls;
    }

    public void setCls(Class<?> cls) {
        this.cls = cls;
    }

    public int getTitle() {
        return title;
    }

    public void setTitle(int title) {
        this.title = title;
    }

    public static SimpleBackPage getPageValue(int val) {
        for (SimpleBackPage p : values()) {
            if (p.getValues() == val) {
                return p;
            }
        }
        return null;
    }
}
伊谢尔伦伊谢尔伦2786日前689

全員に返信(2)返信します

  • PHP中文网

    PHP中文网2017-04-17 14:48:21

    newInstance は Class クラスのメソッドであり、クラスの新しいインスタンスを作成するために使用されます。

    <時間>

    コードの観点から見ると、このコードは複数のフラグメントの相互作用をカプセル化しています。

    渡されるパラメータは Fragment のクラス定義です。これにより、Fragment の不要なインスタンス化を回避できます。Class を介して Fragment をインスタンス化するには、newInstance() メソッドを使用する必要があります。

    返事
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 14:48:21

    問題に基づいてコードを更新しました

    SimpleBackPage は列挙型であり、その目的は数値を通じて対応する Fragment クラスを取得することです。

    SimpleBackPage ページ = SimpleBackPage.getPageValue(pageValue);
    // pageValue=1 の場合、getCls は FeedBackFragment.class を返します。
    // pageValue=2 の場合、getCls は AboutFrameent.class を返します
    ページ.getCls();
    
    public enum SimpleBackPage {
        FEEDBACK(1, R.string.setting_about, FeedBackFragment.class),
        ABOUT(2, R.string.setting_about, AboutFrment.class);
        
        private SimpleBackPage(int 値, int タイトル, Class<?> cls) {
            this.values = 値;
            this.title = タイトル;
            this.cls = cls;
        }
        public Class<?> getCls() {
            CLSを返します。
        
    <時間>

    Fragment クラスを取得した後

    Fragment.class.newInstance() パラメータなしのコンストラクターを呼び出して、このクラスのインスタンスを作成して返します。
    結果は次と同等です: new Fragment();

    そのようなコンストラクターが存在しない場合、または作成が失敗した場合は、このクラスによって表されるクラスの新しいインスタンスを返します。使用可能なメモリが不足している場合、またはコンストラクターによって例外がスローされた場合は、InstantiationException がスローされます。デフォルトのコンストラクターが存在しても、このメソッドが呼び出されたコンテキストからアクセスできない場合は、IllegalAccessException がスローされます。投げられました。

    Fragment.class.newInstance()new Fragment() ほど明確ではないように感じます。また、try/catch 例外タイプ IllegalAccessException も追加する必要があります。

    返事
    0
  • キャンセル返事