簡體   English   中英

片段-如何在需要采取措施的活動中使用它們?

[英]fragments - how to use them with activities that require actions?

首先-為新手問題道歉。

我正在嘗試實現將在我的應用程序中使用的導航抽屜。 首先,我遵循Android教程並創建了一個基本導航,該導航使用Fragments進行了更改。

我可以將framelayout ID和片段傳遞給FragmentTransaction。 效果很好。

我決定使用默認的android文件創建一個新的登錄活動(在Android Studio中:轉到new-activity-login activity)。 這讓我感到困惑。 我的問題是:

  1. 我可以創建LoginActivity的一部分,使LoginActivity中的動作起作用嗎? 看起來該片段將基於傳遞的布局創建視圖,但是LoginActivity中使用的方法不起作用?

  2. 如果創建片段不適用於登錄活動,那么切換活動時確保導航正常的最干凈方法是什么? 導航抽屜僅在主活動上有效; 切換到其他活動(通過Intent)會導致應用丟失導航抽屜操作。 動作欄/導航抽屜的圖像仍然保留。

這是我在MainActivity中的一些代碼...也許我遺漏了一些東西,這些東西在通過Intent切換活動時導致導航抽屜停止運行?

(注意:LoginActivity擴展了LoginActivity類中的MainActivity)

在此先感謝您的任何指示/建議!

public class MainActivity extends ActionBarActivity {

private NavigationDrawerFragment mNavigationDrawerFragment;

//USER DATA
public String mUserID;
public String mToken;
public String mProgramData;

//NAVIGATION DRAWER
private CharSequence mTitle;
private CharSequence mDrawerTitle;
private String[] mTitles;

private DrawerLayout mDrawerLayout;
private ListView mDrawerList;
private ActionBarDrawerToggle mActionBarDrawerToggle;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mTitle = mDrawerTitle = getTitle();

    // get list items for nav
    mTitles = getResources().getStringArray(R.array.nav_menu);

    //drawer widget
    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

    //listview of left drawer
    mDrawerList = (ListView) findViewById(R.id.left_drawer);

    // Set up the drawer.
    mDrawerList.setAdapter(new ArrayAdapter<>(this,
            R.layout.drawer_list_item, mTitles));

    //set onclicklistener on the each list item of menu options
    mDrawerList.setOnItemClickListener(new DrawerItemClickListener());

    // some styling...
    mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);

    //enables action bar app behavior
    getSupportActionBar().setHomeButtonEnabled(true);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    // ties drawerlayout and actionbar for navigation drawers
    mActionBarDrawerToggle = new ActionBarDrawerToggle(
            this,
            mDrawerLayout,
            R.string.navigation_drawer_open,
            R.string.navigation_drawer_close) {

        // different titles for the drawer actions
        public void onDrawerClosed(View drawerView) {
            getSupportActionBar().setTitle(mTitle);
        }

        public void onDrawerOpened(View drawerView) {
            getSupportActionBar().setTitle(mDrawerTitle);
        }

    };

    // set drawer toggle as the drawer listener
    mDrawerLayout.setDrawerListener(mActionBarDrawerToggle);
}

 private class DrawerItemClickListener implements ListView.OnItemClickListener {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id){
        selectItem(position);
    }
}

@Override
protected void onPostCreate(Bundle savedInstanceState){
    super.onPostCreate(savedInstanceState);
    mActionBarDrawerToggle.syncState();
}

@Override
public void onConfigurationChanged(Configuration newConfig){
   super.onConfigurationChanged(newConfig);
   mActionBarDrawerToggle.onConfigurationChanged(newConfig);
}

    @Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    if (mActionBarDrawerToggle.onOptionsItemSelected(item)) {

        return true;
    }

    switch(id) {
        case R.id.action_home:
            Intent home = new Intent(this, MainActivity.class);
            this.startActivity(home);
            break;
        case R.id.action_login:
            Intent login = new Intent(this, LoginActivity.class);
            this.startActivity(login);
            break;
    }
    return super.onOptionsItemSelected(item);
}

編輯

到目前為止,感謝您在指導我提出問題方面的幫助。 不幸的是,我認為我沒有問正確的問題,但是也許從Android Studio查看LoginActivity代碼會有所幫助。

這是LoginActivity的一部分:

public class LoginActivity extends MainActivity implements     LoaderCallbacks<Cursor> {

private UserLoginTask mAuthTask = null;

// UI references.
private AutoCompleteTextView mUserIDView;
private EditText mPasswordView;
private View mProgressView;
private View mLoginFormView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_login);

        // Set up the login form.
        mUserIDView = (AutoCompleteTextView) findViewById(R.id.email);
        populateAutoComplete();

        mPasswordView = (EditText) findViewById(R.id.password);
        mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) {
                if (id == R.id.login || id == EditorInfo.IME_NULL) {
                    attemptLogin();
                    return true;
                }
                return false;
            }
        });

        Button mEmailSignInButton = (Button) findViewById(R.id.email_sign_in_button);
        mEmailSignInButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                attemptLogin();
            }
        });

        mLoginFormView = findViewById(R.id.login_form);
        mProgressView = findViewById(R.id.login_progress);
    }



private void populateAutoComplete() {
    getLoaderManager().initLoader(0, null, this);
}


/**
 * Attempts to sign in or register the account specified by the login form.
 * If there are form errors (invalid email, missing fields, etc.), the
 * errors are presented and no actual login attempt is made.
 */
public void attemptLogin() {
    if (mAuthTask != null) {
        return;
    }

    // Reset errors.
    mUserIDView.setError(null);
    mPasswordView.setError(null);

    // Store values at the time of the login attempt.
    String email = mUserIDView.getText().toString();
    String password = mPasswordView.getText().toString();

    boolean cancel = false;
    View focusView = null;


    // Check for a valid password, if the user entered one.
    if (TextUtils.isEmpty(password)) {
        mPasswordView.setError(getString(R.string.error_invalid_password));
        focusView = mPasswordView;
        cancel = true;
    }

    // Check for a valid email address or ID.
    if (TextUtils.isEmpty(email)) {
        mUserIDView.setError(getString(R.string.error_field_required));
        focusView = mUserIDView;
        cancel = true;
    } else if (!isEmailValid(email) && !isIDValid(email)) {
        mUserIDView.setError(getString(R.string.error_invalid_email));
        focusView = mUserIDView;
        cancel = true;
    }

    if (cancel) {
        // There was an error; don't attempt login and focus the first
        // form field with an error.
        focusView.requestFocus();
    } else {
        // Show a progress spinner, and kick off a background task to
        // perform the user login attempt.
        showProgress(true);
        mAuthTask = new UserLoginTask(email, password);
        mAuthTask.execute((Void) null);
    }
}

private boolean isEmailValid(String email) {
    //TODO: Replace this with your own logic
    return email.contains("@");
}

private boolean isIDValid(String email) {
    //TODO: Replace this with your own logic
    return email.length() == 6;
}
[continued]...........

我將創建一個名為menu1_Fragment的LoginActivity的簡單片段:

public class menu1_Fragment extends android.support.v4.app.Fragment {
View rootview;

public View onCreateView(LayoutInflater inflater, ViewGroup view, Bundle savedInstanceState) {

    rootview = (ViewGroup)inflater.inflate(R.layout.activity_login, null);
    return rootview;
}


}

如果我是正確的(希望我是錯的!),該片段將替換為View( menu1_Fragment )。 視圖不能執行任何操作(例如單擊登錄按鈕發送httppost請求)。

另外,您能否解釋一下為什么MainActivity中的 onOptionsItemSelected會破壞導航抽屜(抽屜變得不可單擊。也無法向右滑動以將其拉起)。 Intent啟動活動(LoginActivity),但僅顯示外觀中的抽屜。

也可以隱藏ActionBar圖標,例如:

 @Override
public boolean onOptionsItemSelected(MenuItem item) {
    // toggle nav drawer on selecting action bar app icon/title
    if (mDrawerToggle.onOptionsItemSelected(item)) {
        return true;
    }
    // Handle action bar actions click
    switch (item.getItemId()) {
        case R.id.action_settings:
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

當您單擊drawable menu list某個項目時,要replacefragment ,我看到您使用了selectItem(position)方法,但是該方法從未在代碼中聲明。 為此,您還可以執行以下操作:

private void selectItem(int position){
    // update the main content by replacing fragments
    Fragment fragment = null;
    switch (position) {
        case 1:
            fragment = new TestFragment();
            break;
        case 2:
            fragment = new TestFragment2();
            break;
        default:
            break;
    }

    if (fragment != null) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit();

        // update selected item and title, then close the drawer
        setTitle(navMenuTitles[position]);
        mDrawerList.setItemChecked(position, true);
        mDrawerList.setSelection(position);
        mDrawerLayout.closeDrawer(mDrawerList);
    } else {
        // error in creating fragment
        Log.e("MainActivity", "Error in creating fragment");
    }
}

我給您一個示例,其中將多個活動定義為片段,並使用MainActivity進行了調用,希望您能在其中找到解決方案。

MainActivity.java

package com.example.fragmentdemo1;

import java.util.ArrayList;

import android.os.Bundle;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.ActionBarActivity;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends ActionBarActivity implements
        OnItemClickListener {

    MainActivity activity;
    private ListView lv;
    private ArrayList<String> list = new ArrayList<String>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        activity = this;
        lv = (ListView) findViewById(R.id.listView);
        list.add("First");
        list.add("Second");
        list.add("Third");
        list.add("Forth");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(activity,
                android.R.layout.simple_list_item_1, list);
        lv.setAdapter(adapter);

        lv.setOnItemClickListener(this);

    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
            long id) {

        switch (position) {
        case 0:
            Fragment1 f1 = new Fragment1();
            FragmentTransaction transaction = getSupportFragmentManager()
                    .beginTransaction();
            transaction.addToBackStack(null);
            transaction.replace(R.id.container, f1).commit();
            break;
        case 1:
            Fragment2 f2 = new Fragment2();
            FragmentTransaction transaction2 = getSupportFragmentManager()
                    .beginTransaction();
            transaction2.addToBackStack(null);
            transaction2.replace(R.id.container, f2).commit();

            break;
        case 2:
            Toast.makeText(activity, "" + position, 1000).show();
            Fragment3 f3 = new Fragment3();
            FragmentTransaction transaction3 = getSupportFragmentManager()
                    .beginTransaction();
            transaction3.addToBackStack(null);
            transaction3.replace(R.id.container, f3).commit();
            break;
        case 3:
            Fragment4 f4 = new Fragment4();
            FragmentTransaction transaction4 = getSupportFragmentManager()
                    .beginTransaction();
            transaction4.addToBackStack(null);
            transaction4.replace(R.id.container, f4).commit();
            break;
        default:
            break;
        }

    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        switch (id) {
        case android.R.id.home:

            finish();
            break;

        default:
            break;
        }

        return false;
    }

}

Fragment1.java

package com.example.fragmentdemo1;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;


public class Fragment1 extends android.support.v4.app.Fragment{

    TextView tv;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup view,
            Bundle savedInstanceState) {
        tv =(TextView)view.findViewById(R.id.textView1);
        view = (ViewGroup) inflater.inflate(R.layout.fragment1, null);
        return view;
    }
}

Fragment2.java

package com.example.fragmentdemo1;

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

    public class Fragment2 extends Fragment {

        TextView tv;
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup view,
                Bundle savedInstanceState) {
            tv =(TextView)view.findViewById(R.id.textView2);
            view = (ViewGroup) inflater.inflate(R.layout.fragment2, null);
            return view;
        }
    }

Fragment3.java

package com.example.fragmentdemo1;

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

    public class Fragment3 extends Fragment {
        TextView tv;
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup view,
                Bundle savedInstanceState) {

            tv =(TextView)view.findViewById(R.id.textView3);
            view =(ViewGroup)inflater.inflate(R.layout.fragment3, null);
            return view;
        }
    }

Fragment4.java

package com.example.fragmentdemo1;

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

public class Fragment4 extends Fragment{

    TextView tv;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup view,
            Bundle savedInstanceState) {
        tv =(TextView)view.findViewById(R.id.textView4);

        view = (ViewGroup)inflater.inflate(R.layout.fragment4, null);
        return view;
    }
}

注意:如果要使用從Fragment類到MainActivity的方法,則可以將其設為public static ,並且可以通過其類名直接使用該方法,例如Fragment1.countData()

該演示也適用於導航抽屜。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM